{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:28:55.352591Z",
     "start_time": "2025-01-23T10:28:35.163364Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:38:56.817643Z",
     "start_time": "2025-01-23T10:38:53.784838Z"
    }
   },
   "source": [
    "from tensorflow import keras  #这里的波浪线不用管\n",
    "\n",
    "#用karas有的数据集imdb，电影分类,分电影是积极的，还是消极的\n",
    "imdb = keras.datasets.imdb\n",
    "#载入数据使用下面两个参数\n",
    "vocab_size = 10000  #词典大小，仅保留训练数据中前10000个最经常出现的单词，低频单词被舍弃\n",
    "index_from = 3  #0,1,2,3空出来做别的事\n",
    "#前一万个词出现词频最高的会保留下来进行处理，后面的作为特殊字符处理，\n",
    "# 小于3的id都是特殊字符，下面代码有写\n",
    "# 需要注意的一点是取出来的词表还是从1开始的，需要做处理\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words=vocab_size, index_from=index_from)   #用index_from来索引实际的单词"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_labels)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T10:47:05.908273Z",
     "start_time": "2025-01-23T10:47:05.604191Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "source": [
    "print(type(train_data))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T10:48:09.306695Z",
     "start_time": "2025-01-23T10:48:09.302976Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:48:10.198348Z",
     "start_time": "2025-01-23T10:48:10.193172Z"
    }
   },
   "cell_type": "code",
   "source": "train_data.shape  #每个样本是一段话，每个单词用一个数字表示",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000,)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_data[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T02:41:20.297524Z",
     "start_time": "2025-01-23T02:41:20.294848Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "list"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": ""
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:48:52.829536Z",
     "start_time": "2025-01-23T10:48:52.824286Z"
    }
   },
   "cell_type": "code",
   "source": "train_data[0]",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1,\n",
       " 14,\n",
       " 22,\n",
       " 16,\n",
       " 43,\n",
       " 530,\n",
       " 973,\n",
       " 1622,\n",
       " 1385,\n",
       " 65,\n",
       " 458,\n",
       " 4468,\n",
       " 66,\n",
       " 3941,\n",
       " 4,\n",
       " 173,\n",
       " 36,\n",
       " 256,\n",
       " 5,\n",
       " 25,\n",
       " 100,\n",
       " 43,\n",
       " 838,\n",
       " 112,\n",
       " 50,\n",
       " 670,\n",
       " 2,\n",
       " 9,\n",
       " 35,\n",
       " 480,\n",
       " 284,\n",
       " 5,\n",
       " 150,\n",
       " 4,\n",
       " 172,\n",
       " 112,\n",
       " 167,\n",
       " 2,\n",
       " 336,\n",
       " 385,\n",
       " 39,\n",
       " 4,\n",
       " 172,\n",
       " 4536,\n",
       " 1111,\n",
       " 17,\n",
       " 546,\n",
       " 38,\n",
       " 13,\n",
       " 447,\n",
       " 4,\n",
       " 192,\n",
       " 50,\n",
       " 16,\n",
       " 6,\n",
       " 147,\n",
       " 2025,\n",
       " 19,\n",
       " 14,\n",
       " 22,\n",
       " 4,\n",
       " 1920,\n",
       " 4613,\n",
       " 469,\n",
       " 4,\n",
       " 22,\n",
       " 71,\n",
       " 87,\n",
       " 12,\n",
       " 16,\n",
       " 43,\n",
       " 530,\n",
       " 38,\n",
       " 76,\n",
       " 15,\n",
       " 13,\n",
       " 1247,\n",
       " 4,\n",
       " 22,\n",
       " 17,\n",
       " 515,\n",
       " 17,\n",
       " 12,\n",
       " 16,\n",
       " 626,\n",
       " 18,\n",
       " 2,\n",
       " 5,\n",
       " 62,\n",
       " 386,\n",
       " 12,\n",
       " 8,\n",
       " 316,\n",
       " 8,\n",
       " 106,\n",
       " 5,\n",
       " 4,\n",
       " 2223,\n",
       " 5244,\n",
       " 16,\n",
       " 480,\n",
       " 66,\n",
       " 3785,\n",
       " 33,\n",
       " 4,\n",
       " 130,\n",
       " 12,\n",
       " 16,\n",
       " 38,\n",
       " 619,\n",
       " 5,\n",
       " 25,\n",
       " 124,\n",
       " 51,\n",
       " 36,\n",
       " 135,\n",
       " 48,\n",
       " 25,\n",
       " 1415,\n",
       " 33,\n",
       " 6,\n",
       " 22,\n",
       " 12,\n",
       " 215,\n",
       " 28,\n",
       " 77,\n",
       " 52,\n",
       " 5,\n",
       " 14,\n",
       " 407,\n",
       " 16,\n",
       " 82,\n",
       " 2,\n",
       " 8,\n",
       " 4,\n",
       " 107,\n",
       " 117,\n",
       " 5952,\n",
       " 15,\n",
       " 256,\n",
       " 4,\n",
       " 2,\n",
       " 7,\n",
       " 3766,\n",
       " 5,\n",
       " 723,\n",
       " 36,\n",
       " 71,\n",
       " 43,\n",
       " 530,\n",
       " 476,\n",
       " 26,\n",
       " 400,\n",
       " 317,\n",
       " 46,\n",
       " 7,\n",
       " 4,\n",
       " 2,\n",
       " 1029,\n",
       " 13,\n",
       " 104,\n",
       " 88,\n",
       " 4,\n",
       " 381,\n",
       " 15,\n",
       " 297,\n",
       " 98,\n",
       " 32,\n",
       " 2071,\n",
       " 56,\n",
       " 26,\n",
       " 141,\n",
       " 6,\n",
       " 194,\n",
       " 7486,\n",
       " 18,\n",
       " 4,\n",
       " 226,\n",
       " 22,\n",
       " 21,\n",
       " 134,\n",
       " 476,\n",
       " 26,\n",
       " 480,\n",
       " 5,\n",
       " 144,\n",
       " 30,\n",
       " 5535,\n",
       " 18,\n",
       " 51,\n",
       " 36,\n",
       " 28,\n",
       " 224,\n",
       " 92,\n",
       " 25,\n",
       " 104,\n",
       " 4,\n",
       " 226,\n",
       " 65,\n",
       " 16,\n",
       " 38,\n",
       " 1334,\n",
       " 88,\n",
       " 12,\n",
       " 16,\n",
       " 283,\n",
       " 5,\n",
       " 16,\n",
       " 4472,\n",
       " 113,\n",
       " 103,\n",
       " 32,\n",
       " 15,\n",
       " 16,\n",
       " 5345,\n",
       " 19,\n",
       " 178,\n",
       " 32]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T02:49:44.840885Z",
     "start_time": "2025-01-23T02:49:44.838238Z"
    }
   },
   "cell_type": "code",
   "source": "len(train_data[0])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "218"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:50:37.903039Z",
     "start_time": "2025-01-23T10:50:37.899544Z"
    }
   },
   "cell_type": "code",
   "source": "len(test_data[0])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "68"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:50:15.939937Z",
     "start_time": "2025-01-23T10:50:15.935837Z"
    }
   },
   "cell_type": "code",
   "source": "test_labels[0:10]  #二分类",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 1, 0, 1, 1, 1, 0, 0, 1], dtype=int64)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "code",
   "source": [
    "train_labels[0:10]  #二分类"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T02:41:31.762074Z",
     "start_time": "2025-01-23T02:41:31.759252Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 0, 1, 0, 0, 1, 0, 1, 0], dtype=int64)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train 25000 (25000,)\n",
      "test 25000 (25000,)\n"
     ]
    }
   ],
   "source": [
    "print(\"train\", len(train_data), train_labels.shape)  #25000个样本，每个样本是一段话，每个单词用一个数字表示\n",
    "print(\"test\", len(test_data), test_labels.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-29T01:31:13.411229100Z",
     "start_time": "2024-07-29T01:31:13.376232500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:57:11.972463Z",
     "start_time": "2025-01-23T10:57:11.912791Z"
    }
   },
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "print(type(word_index))\n",
    "word_index\n",
    "#词表虽然有8万多，但是我们只载入了最高频的1万词！！！！"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88584\n",
      "<class 'dict'>\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'fawn': 34701,\n",
       " 'tsukino': 52006,\n",
       " 'nunnery': 52007,\n",
       " 'sonja': 16816,\n",
       " 'vani': 63951,\n",
       " 'woods': 1408,\n",
       " 'spiders': 16115,\n",
       " 'hanging': 2345,\n",
       " 'woody': 2289,\n",
       " 'trawling': 52008,\n",
       " \"hold's\": 52009,\n",
       " 'comically': 11307,\n",
       " 'localized': 40830,\n",
       " 'disobeying': 30568,\n",
       " \"'royale\": 52010,\n",
       " \"harpo's\": 40831,\n",
       " 'canet': 52011,\n",
       " 'aileen': 19313,\n",
       " 'acurately': 52012,\n",
       " \"diplomat's\": 52013,\n",
       " 'rickman': 25242,\n",
       " 'arranged': 6746,\n",
       " 'rumbustious': 52014,\n",
       " 'familiarness': 52015,\n",
       " \"spider'\": 52016,\n",
       " 'hahahah': 68804,\n",
       " \"wood'\": 52017,\n",
       " 'transvestism': 40833,\n",
       " \"hangin'\": 34702,\n",
       " 'bringing': 2338,\n",
       " 'seamier': 40834,\n",
       " 'wooded': 34703,\n",
       " 'bravora': 52018,\n",
       " 'grueling': 16817,\n",
       " 'wooden': 1636,\n",
       " 'wednesday': 16818,\n",
       " \"'prix\": 52019,\n",
       " 'altagracia': 34704,\n",
       " 'circuitry': 52020,\n",
       " 'crotch': 11585,\n",
       " 'busybody': 57766,\n",
       " \"tart'n'tangy\": 52021,\n",
       " 'burgade': 14129,\n",
       " 'thrace': 52023,\n",
       " \"tom's\": 11038,\n",
       " 'snuggles': 52025,\n",
       " 'francesco': 29114,\n",
       " 'complainers': 52027,\n",
       " 'templarios': 52125,\n",
       " '272': 40835,\n",
       " '273': 52028,\n",
       " 'zaniacs': 52130,\n",
       " '275': 34706,\n",
       " 'consenting': 27631,\n",
       " 'snuggled': 40836,\n",
       " 'inanimate': 15492,\n",
       " 'uality': 52030,\n",
       " 'bronte': 11926,\n",
       " 'errors': 4010,\n",
       " 'dialogs': 3230,\n",
       " \"yomada's\": 52031,\n",
       " \"madman's\": 34707,\n",
       " 'dialoge': 30585,\n",
       " 'usenet': 52033,\n",
       " 'videodrome': 40837,\n",
       " \"kid'\": 26338,\n",
       " 'pawed': 52034,\n",
       " \"'girlfriend'\": 30569,\n",
       " \"'pleasure\": 52035,\n",
       " \"'reloaded'\": 52036,\n",
       " \"kazakos'\": 40839,\n",
       " 'rocque': 52037,\n",
       " 'mailings': 52038,\n",
       " 'brainwashed': 11927,\n",
       " 'mcanally': 16819,\n",
       " \"tom''\": 52039,\n",
       " 'kurupt': 25243,\n",
       " 'affiliated': 21905,\n",
       " 'babaganoosh': 52040,\n",
       " \"noe's\": 40840,\n",
       " 'quart': 40841,\n",
       " 'kids': 359,\n",
       " 'uplifting': 5034,\n",
       " 'controversy': 7093,\n",
       " 'kida': 21906,\n",
       " 'kidd': 23379,\n",
       " \"error'\": 52041,\n",
       " 'neurologist': 52042,\n",
       " 'spotty': 18510,\n",
       " 'cobblers': 30570,\n",
       " 'projection': 9878,\n",
       " 'fastforwarding': 40842,\n",
       " 'sters': 52043,\n",
       " \"eggar's\": 52044,\n",
       " 'etherything': 52045,\n",
       " 'gateshead': 40843,\n",
       " 'airball': 34708,\n",
       " 'unsinkable': 25244,\n",
       " 'stern': 7180,\n",
       " \"cervi's\": 52046,\n",
       " 'dnd': 40844,\n",
       " 'dna': 11586,\n",
       " 'insecurity': 20598,\n",
       " \"'reboot'\": 52047,\n",
       " 'trelkovsky': 11037,\n",
       " 'jaekel': 52048,\n",
       " 'sidebars': 52049,\n",
       " \"sforza's\": 52050,\n",
       " 'distortions': 17633,\n",
       " 'mutinies': 52051,\n",
       " 'sermons': 30602,\n",
       " '7ft': 40846,\n",
       " 'boobage': 52052,\n",
       " \"o'bannon's\": 52053,\n",
       " 'populations': 23380,\n",
       " 'chulak': 52054,\n",
       " 'mesmerize': 27633,\n",
       " 'quinnell': 52055,\n",
       " 'yahoo': 10307,\n",
       " 'meteorologist': 52057,\n",
       " 'beswick': 42577,\n",
       " 'boorman': 15493,\n",
       " 'voicework': 40847,\n",
       " \"ster'\": 52058,\n",
       " 'blustering': 22922,\n",
       " 'hj': 52059,\n",
       " 'intake': 27634,\n",
       " 'morally': 5621,\n",
       " 'jumbling': 40849,\n",
       " 'bowersock': 52060,\n",
       " \"'porky's'\": 52061,\n",
       " 'gershon': 16821,\n",
       " 'ludicrosity': 40850,\n",
       " 'coprophilia': 52062,\n",
       " 'expressively': 40851,\n",
       " \"india's\": 19500,\n",
       " \"post's\": 34710,\n",
       " 'wana': 52063,\n",
       " 'wang': 5283,\n",
       " 'wand': 30571,\n",
       " 'wane': 25245,\n",
       " 'edgeways': 52321,\n",
       " 'titanium': 34711,\n",
       " 'pinta': 40852,\n",
       " 'want': 178,\n",
       " 'pinto': 30572,\n",
       " 'whoopdedoodles': 52065,\n",
       " 'tchaikovsky': 21908,\n",
       " 'travel': 2103,\n",
       " \"'victory'\": 52066,\n",
       " 'copious': 11928,\n",
       " 'gouge': 22433,\n",
       " \"chapters'\": 52067,\n",
       " 'barbra': 6702,\n",
       " 'uselessness': 30573,\n",
       " \"wan'\": 52068,\n",
       " 'assimilated': 27635,\n",
       " 'petiot': 16116,\n",
       " 'most\\x85and': 52069,\n",
       " 'dinosaurs': 3930,\n",
       " 'wrong': 352,\n",
       " 'seda': 52070,\n",
       " 'stollen': 52071,\n",
       " 'sentencing': 34712,\n",
       " 'ouroboros': 40853,\n",
       " 'assimilates': 40854,\n",
       " 'colorfully': 40855,\n",
       " 'glenne': 27636,\n",
       " 'dongen': 52072,\n",
       " 'subplots': 4760,\n",
       " 'kiloton': 52073,\n",
       " 'chandon': 23381,\n",
       " \"effect'\": 34713,\n",
       " 'snugly': 27637,\n",
       " 'kuei': 40856,\n",
       " 'welcomed': 9092,\n",
       " 'dishonor': 30071,\n",
       " 'concurrence': 52075,\n",
       " 'stoicism': 23382,\n",
       " \"guys'\": 14896,\n",
       " \"beroemd'\": 52077,\n",
       " 'butcher': 6703,\n",
       " \"melfi's\": 40857,\n",
       " 'aargh': 30623,\n",
       " 'playhouse': 20599,\n",
       " 'wickedly': 11308,\n",
       " 'fit': 1180,\n",
       " 'labratory': 52078,\n",
       " 'lifeline': 40859,\n",
       " 'screaming': 1927,\n",
       " 'fix': 4287,\n",
       " 'cineliterate': 52079,\n",
       " 'fic': 52080,\n",
       " 'fia': 52081,\n",
       " 'fig': 34714,\n",
       " 'fmvs': 52082,\n",
       " 'fie': 52083,\n",
       " 'reentered': 52084,\n",
       " 'fin': 30574,\n",
       " 'doctresses': 52085,\n",
       " 'fil': 52086,\n",
       " 'zucker': 12606,\n",
       " 'ached': 31931,\n",
       " 'counsil': 52088,\n",
       " 'paterfamilias': 52089,\n",
       " 'songwriter': 13885,\n",
       " 'shivam': 34715,\n",
       " 'hurting': 9654,\n",
       " 'effects': 299,\n",
       " 'slauther': 52090,\n",
       " \"'flame'\": 52091,\n",
       " 'sommerset': 52092,\n",
       " 'interwhined': 52093,\n",
       " 'whacking': 27638,\n",
       " 'bartok': 52094,\n",
       " 'barton': 8775,\n",
       " 'frewer': 21909,\n",
       " \"fi'\": 52095,\n",
       " 'ingrid': 6192,\n",
       " 'stribor': 30575,\n",
       " 'approporiately': 52096,\n",
       " 'wobblyhand': 52097,\n",
       " 'tantalisingly': 52098,\n",
       " 'ankylosaurus': 52099,\n",
       " 'parasites': 17634,\n",
       " 'childen': 52100,\n",
       " \"jenkins'\": 52101,\n",
       " 'metafiction': 52102,\n",
       " 'golem': 17635,\n",
       " 'indiscretion': 40860,\n",
       " \"reeves'\": 23383,\n",
       " \"inamorata's\": 57781,\n",
       " 'brittannica': 52104,\n",
       " 'adapt': 7916,\n",
       " \"russo's\": 30576,\n",
       " 'guitarists': 48246,\n",
       " 'abbott': 10553,\n",
       " 'abbots': 40861,\n",
       " 'lanisha': 17649,\n",
       " 'magickal': 40863,\n",
       " 'mattter': 52105,\n",
       " \"'willy\": 52106,\n",
       " 'pumpkins': 34716,\n",
       " 'stuntpeople': 52107,\n",
       " 'estimate': 30577,\n",
       " 'ugghhh': 40864,\n",
       " 'gameplay': 11309,\n",
       " \"wern't\": 52108,\n",
       " \"n'sync\": 40865,\n",
       " 'sickeningly': 16117,\n",
       " 'chiara': 40866,\n",
       " 'disturbed': 4011,\n",
       " 'portmanteau': 40867,\n",
       " 'ineffectively': 52109,\n",
       " \"duchonvey's\": 82143,\n",
       " \"nasty'\": 37519,\n",
       " 'purpose': 1285,\n",
       " 'lazers': 52112,\n",
       " 'lightened': 28105,\n",
       " 'kaliganj': 52113,\n",
       " 'popularism': 52114,\n",
       " \"damme's\": 18511,\n",
       " 'stylistics': 30578,\n",
       " 'mindgaming': 52115,\n",
       " 'spoilerish': 46449,\n",
       " \"'corny'\": 52117,\n",
       " 'boerner': 34718,\n",
       " 'olds': 6792,\n",
       " 'bakelite': 52118,\n",
       " 'renovated': 27639,\n",
       " 'forrester': 27640,\n",
       " \"lumiere's\": 52119,\n",
       " 'gaskets': 52024,\n",
       " 'needed': 884,\n",
       " 'smight': 34719,\n",
       " 'master': 1297,\n",
       " \"edie's\": 25905,\n",
       " 'seeber': 40868,\n",
       " 'hiya': 52120,\n",
       " 'fuzziness': 52121,\n",
       " 'genesis': 14897,\n",
       " 'rewards': 12607,\n",
       " 'enthrall': 30579,\n",
       " \"'about\": 40869,\n",
       " \"recollection's\": 52122,\n",
       " 'mutilated': 11039,\n",
       " 'fatherlands': 52123,\n",
       " \"fischer's\": 52124,\n",
       " 'positively': 5399,\n",
       " '270': 34705,\n",
       " 'ahmed': 34720,\n",
       " 'zatoichi': 9836,\n",
       " 'bannister': 13886,\n",
       " 'anniversaries': 52127,\n",
       " \"helm's\": 30580,\n",
       " \"'work'\": 52128,\n",
       " 'exclaimed': 34721,\n",
       " \"'unfunny'\": 52129,\n",
       " '274': 52029,\n",
       " 'feeling': 544,\n",
       " \"wanda's\": 52131,\n",
       " 'dolan': 33266,\n",
       " '278': 52133,\n",
       " 'peacoat': 52134,\n",
       " 'brawny': 40870,\n",
       " 'mishra': 40871,\n",
       " 'worlders': 40872,\n",
       " 'protags': 52135,\n",
       " 'skullcap': 52136,\n",
       " 'dastagir': 57596,\n",
       " 'affairs': 5622,\n",
       " 'wholesome': 7799,\n",
       " 'hymen': 52137,\n",
       " 'paramedics': 25246,\n",
       " 'unpersons': 52138,\n",
       " 'heavyarms': 52139,\n",
       " 'affaire': 52140,\n",
       " 'coulisses': 52141,\n",
       " 'hymer': 40873,\n",
       " 'kremlin': 52142,\n",
       " 'shipments': 30581,\n",
       " 'pixilated': 52143,\n",
       " \"'00s\": 30582,\n",
       " 'diminishing': 18512,\n",
       " 'cinematic': 1357,\n",
       " 'resonates': 14898,\n",
       " 'simplify': 40874,\n",
       " \"nature'\": 40875,\n",
       " 'temptresses': 40876,\n",
       " 'reverence': 16822,\n",
       " 'resonated': 19502,\n",
       " 'dailey': 34722,\n",
       " '2\\x85': 52144,\n",
       " 'treize': 27641,\n",
       " 'majo': 52145,\n",
       " 'kiya': 21910,\n",
       " 'woolnough': 52146,\n",
       " 'thanatos': 39797,\n",
       " 'sandoval': 35731,\n",
       " 'dorama': 40879,\n",
       " \"o'shaughnessy\": 52147,\n",
       " 'tech': 4988,\n",
       " 'fugitives': 32018,\n",
       " 'teck': 30583,\n",
       " \"'e'\": 76125,\n",
       " 'doesn’t': 40881,\n",
       " 'purged': 52149,\n",
       " 'saying': 657,\n",
       " \"martians'\": 41095,\n",
       " 'norliss': 23418,\n",
       " 'dickey': 27642,\n",
       " 'dicker': 52152,\n",
       " \"'sependipity\": 52153,\n",
       " 'padded': 8422,\n",
       " 'ordell': 57792,\n",
       " \"sturges'\": 40882,\n",
       " 'independentcritics': 52154,\n",
       " 'tempted': 5745,\n",
       " \"atkinson's\": 34724,\n",
       " 'hounded': 25247,\n",
       " 'apace': 52155,\n",
       " 'clicked': 15494,\n",
       " \"'humor'\": 30584,\n",
       " \"martino's\": 17177,\n",
       " \"'supporting\": 52156,\n",
       " 'warmongering': 52032,\n",
       " \"zemeckis's\": 34725,\n",
       " 'lube': 21911,\n",
       " 'shocky': 52157,\n",
       " 'plate': 7476,\n",
       " 'plata': 40883,\n",
       " 'sturgess': 40884,\n",
       " \"nerds'\": 40885,\n",
       " 'plato': 20600,\n",
       " 'plath': 34726,\n",
       " 'platt': 40886,\n",
       " 'mcnab': 52159,\n",
       " 'clumsiness': 27643,\n",
       " 'altogether': 3899,\n",
       " 'massacring': 42584,\n",
       " 'bicenntinial': 52160,\n",
       " 'skaal': 40887,\n",
       " 'droning': 14360,\n",
       " 'lds': 8776,\n",
       " 'jaguar': 21912,\n",
       " \"cale's\": 34727,\n",
       " 'nicely': 1777,\n",
       " 'mummy': 4588,\n",
       " \"lot's\": 18513,\n",
       " 'patch': 10086,\n",
       " 'kerkhof': 50202,\n",
       " \"leader's\": 52161,\n",
       " \"'movie\": 27644,\n",
       " 'uncomfirmed': 52162,\n",
       " 'heirloom': 40888,\n",
       " 'wrangle': 47360,\n",
       " 'emotion\\x85': 52163,\n",
       " \"'stargate'\": 52164,\n",
       " 'pinoy': 40889,\n",
       " 'conchatta': 40890,\n",
       " 'broeke': 41128,\n",
       " 'advisedly': 40891,\n",
       " \"barker's\": 17636,\n",
       " 'descours': 52166,\n",
       " 'lots': 772,\n",
       " 'lotr': 9259,\n",
       " 'irs': 9879,\n",
       " 'lott': 52167,\n",
       " 'xvi': 40892,\n",
       " 'irk': 34728,\n",
       " 'irl': 52168,\n",
       " 'ira': 6887,\n",
       " 'belzer': 21913,\n",
       " 'irc': 52169,\n",
       " 'ire': 27645,\n",
       " 'requisites': 40893,\n",
       " 'discipline': 7693,\n",
       " 'lyoko': 52961,\n",
       " 'extend': 11310,\n",
       " 'nature': 873,\n",
       " \"'dickie'\": 52170,\n",
       " 'optimist': 40894,\n",
       " 'lapping': 30586,\n",
       " 'superficial': 3900,\n",
       " 'vestment': 52171,\n",
       " 'extent': 2823,\n",
       " 'tendons': 52172,\n",
       " \"heller's\": 52173,\n",
       " 'quagmires': 52174,\n",
       " 'miyako': 52175,\n",
       " 'moocow': 20601,\n",
       " \"coles'\": 52176,\n",
       " 'lookit': 40895,\n",
       " 'ravenously': 52177,\n",
       " 'levitating': 40896,\n",
       " 'perfunctorily': 52178,\n",
       " 'lookin': 30587,\n",
       " \"lot'\": 40898,\n",
       " 'lookie': 52179,\n",
       " 'fearlessly': 34870,\n",
       " 'libyan': 52181,\n",
       " 'fondles': 40899,\n",
       " 'gopher': 35714,\n",
       " 'wearying': 40901,\n",
       " \"nz's\": 52182,\n",
       " 'minuses': 27646,\n",
       " 'puposelessly': 52183,\n",
       " 'shandling': 52184,\n",
       " 'decapitates': 31268,\n",
       " 'humming': 11929,\n",
       " \"'nother\": 40902,\n",
       " 'smackdown': 21914,\n",
       " 'underdone': 30588,\n",
       " 'frf': 40903,\n",
       " 'triviality': 52185,\n",
       " 'fro': 25248,\n",
       " 'bothers': 8777,\n",
       " \"'kensington\": 52186,\n",
       " 'much': 73,\n",
       " 'muco': 34730,\n",
       " 'wiseguy': 22615,\n",
       " \"richie's\": 27648,\n",
       " 'tonino': 40904,\n",
       " 'unleavened': 52187,\n",
       " 'fry': 11587,\n",
       " \"'tv'\": 40905,\n",
       " 'toning': 40906,\n",
       " 'obese': 14361,\n",
       " 'sensationalized': 30589,\n",
       " 'spiv': 40907,\n",
       " 'spit': 6259,\n",
       " 'arkin': 7364,\n",
       " 'charleton': 21915,\n",
       " 'jeon': 16823,\n",
       " 'boardroom': 21916,\n",
       " 'doubts': 4989,\n",
       " 'spin': 3084,\n",
       " 'hepo': 53083,\n",
       " 'wildcat': 27649,\n",
       " 'venoms': 10584,\n",
       " 'misconstrues': 52191,\n",
       " 'mesmerising': 18514,\n",
       " 'misconstrued': 40908,\n",
       " 'rescinds': 52192,\n",
       " 'prostrate': 52193,\n",
       " 'majid': 40909,\n",
       " 'climbed': 16479,\n",
       " 'canoeing': 34731,\n",
       " 'majin': 52195,\n",
       " 'animie': 57804,\n",
       " 'sylke': 40910,\n",
       " 'conditioned': 14899,\n",
       " 'waddell': 40911,\n",
       " '3\\x85': 52196,\n",
       " 'hyperdrive': 41188,\n",
       " 'conditioner': 34732,\n",
       " 'bricklayer': 53153,\n",
       " 'hong': 2576,\n",
       " 'memoriam': 52198,\n",
       " 'inventively': 30592,\n",
       " \"levant's\": 25249,\n",
       " 'portobello': 20638,\n",
       " 'remand': 52200,\n",
       " 'mummified': 19504,\n",
       " 'honk': 27650,\n",
       " 'spews': 19505,\n",
       " 'visitations': 40912,\n",
       " 'mummifies': 52201,\n",
       " 'cavanaugh': 25250,\n",
       " 'zeon': 23385,\n",
       " \"jungle's\": 40913,\n",
       " 'viertel': 34733,\n",
       " 'frenchmen': 27651,\n",
       " 'torpedoes': 52202,\n",
       " 'schlessinger': 52203,\n",
       " 'torpedoed': 34734,\n",
       " 'blister': 69876,\n",
       " 'cinefest': 52204,\n",
       " 'furlough': 34735,\n",
       " 'mainsequence': 52205,\n",
       " 'mentors': 40914,\n",
       " 'academic': 9094,\n",
       " 'stillness': 20602,\n",
       " 'academia': 40915,\n",
       " 'lonelier': 52206,\n",
       " 'nibby': 52207,\n",
       " \"losers'\": 52208,\n",
       " 'cineastes': 40916,\n",
       " 'corporate': 4449,\n",
       " 'massaging': 40917,\n",
       " 'bellow': 30593,\n",
       " 'absurdities': 19506,\n",
       " 'expetations': 53241,\n",
       " 'nyfiken': 40918,\n",
       " 'mehras': 75638,\n",
       " 'lasse': 52209,\n",
       " 'visability': 52210,\n",
       " 'militarily': 33946,\n",
       " \"elder'\": 52211,\n",
       " 'gainsbourg': 19023,\n",
       " 'hah': 20603,\n",
       " 'hai': 13420,\n",
       " 'haj': 34736,\n",
       " 'hak': 25251,\n",
       " 'hal': 4311,\n",
       " 'ham': 4892,\n",
       " 'duffer': 53259,\n",
       " 'haa': 52213,\n",
       " 'had': 66,\n",
       " 'advancement': 11930,\n",
       " 'hag': 16825,\n",
       " \"hand'\": 25252,\n",
       " 'hay': 13421,\n",
       " 'mcnamara': 20604,\n",
       " \"mozart's\": 52214,\n",
       " 'duffel': 30731,\n",
       " 'haq': 30594,\n",
       " 'har': 13887,\n",
       " 'has': 44,\n",
       " 'hat': 2401,\n",
       " 'hav': 40919,\n",
       " 'haw': 30595,\n",
       " 'figtings': 52215,\n",
       " 'elders': 15495,\n",
       " 'underpanted': 52216,\n",
       " 'pninson': 52217,\n",
       " 'unequivocally': 27652,\n",
       " \"barbara's\": 23673,\n",
       " \"bello'\": 52219,\n",
       " 'indicative': 12997,\n",
       " 'yawnfest': 40920,\n",
       " 'hexploitation': 52220,\n",
       " \"loder's\": 52221,\n",
       " 'sleuthing': 27653,\n",
       " \"justin's\": 32622,\n",
       " \"'ball\": 52222,\n",
       " \"'summer\": 52223,\n",
       " \"'demons'\": 34935,\n",
       " \"mormon's\": 52225,\n",
       " \"laughton's\": 34737,\n",
       " 'debell': 52226,\n",
       " 'shipyard': 39724,\n",
       " 'unabashedly': 30597,\n",
       " 'disks': 40401,\n",
       " 'crowd': 2290,\n",
       " 'crowe': 10087,\n",
       " \"vancouver's\": 56434,\n",
       " 'mosques': 34738,\n",
       " 'crown': 6627,\n",
       " 'culpas': 52227,\n",
       " 'crows': 27654,\n",
       " 'surrell': 53344,\n",
       " 'flowless': 52229,\n",
       " 'sheirk': 52230,\n",
       " \"'three\": 40923,\n",
       " \"peterson'\": 52231,\n",
       " 'ooverall': 52232,\n",
       " 'perchance': 40924,\n",
       " 'bottom': 1321,\n",
       " 'chabert': 53363,\n",
       " 'sneha': 52233,\n",
       " 'inhuman': 13888,\n",
       " 'ichii': 52234,\n",
       " 'ursla': 52235,\n",
       " 'completly': 30598,\n",
       " 'moviedom': 40925,\n",
       " 'raddick': 52236,\n",
       " 'brundage': 51995,\n",
       " 'brigades': 40926,\n",
       " 'starring': 1181,\n",
       " \"'goal'\": 52237,\n",
       " 'caskets': 52238,\n",
       " 'willcock': 52239,\n",
       " \"threesome's\": 52240,\n",
       " \"mosque'\": 52241,\n",
       " \"cover's\": 52242,\n",
       " 'spaceships': 17637,\n",
       " 'anomalous': 40927,\n",
       " 'ptsd': 27655,\n",
       " 'shirdan': 52243,\n",
       " 'obscenity': 21962,\n",
       " 'lemmings': 30599,\n",
       " 'duccio': 30600,\n",
       " \"levene's\": 52244,\n",
       " \"'gorby'\": 52245,\n",
       " \"teenager's\": 25255,\n",
       " 'marshall': 5340,\n",
       " 'honeymoon': 9095,\n",
       " 'shoots': 3231,\n",
       " 'despised': 12258,\n",
       " 'okabasho': 52246,\n",
       " 'fabric': 8289,\n",
       " 'cannavale': 18515,\n",
       " 'raped': 3537,\n",
       " \"tutt's\": 52247,\n",
       " 'grasping': 17638,\n",
       " 'despises': 18516,\n",
       " \"thief's\": 40928,\n",
       " 'rapes': 8926,\n",
       " 'raper': 52248,\n",
       " \"eyre'\": 27656,\n",
       " 'walchek': 52249,\n",
       " \"elmo's\": 23386,\n",
       " 'perfumes': 40929,\n",
       " 'spurting': 21918,\n",
       " \"exposition'\\x85\": 52250,\n",
       " 'denoting': 52251,\n",
       " 'thesaurus': 34740,\n",
       " \"shoot'\": 40930,\n",
       " 'bonejack': 49759,\n",
       " 'simpsonian': 52253,\n",
       " 'hebetude': 30601,\n",
       " \"hallow's\": 34741,\n",
       " 'desperation\\x85': 52254,\n",
       " 'incinerator': 34742,\n",
       " 'congratulations': 10308,\n",
       " 'humbled': 52255,\n",
       " \"else's\": 5924,\n",
       " 'trelkovski': 40845,\n",
       " \"rape'\": 52256,\n",
       " \"'chapters'\": 59386,\n",
       " '1600s': 52257,\n",
       " 'martian': 7253,\n",
       " 'nicest': 25256,\n",
       " 'eyred': 52259,\n",
       " 'passenger': 9457,\n",
       " 'disgrace': 6041,\n",
       " 'moderne': 52260,\n",
       " 'barrymore': 5120,\n",
       " 'yankovich': 52261,\n",
       " 'moderns': 40931,\n",
       " 'studliest': 52262,\n",
       " 'bedsheet': 52263,\n",
       " 'decapitation': 14900,\n",
       " 'slurring': 52264,\n",
       " \"'nunsploitation'\": 52265,\n",
       " \"'character'\": 34743,\n",
       " 'cambodia': 9880,\n",
       " 'rebelious': 52266,\n",
       " 'pasadena': 27657,\n",
       " 'crowne': 40932,\n",
       " \"'bedchamber\": 52267,\n",
       " 'conjectural': 52268,\n",
       " 'appologize': 52269,\n",
       " 'halfassing': 52270,\n",
       " 'paycheque': 57816,\n",
       " 'palms': 20606,\n",
       " \"'islands\": 52271,\n",
       " 'hawked': 40933,\n",
       " 'palme': 21919,\n",
       " 'conservatively': 40934,\n",
       " 'larp': 64007,\n",
       " 'palma': 5558,\n",
       " 'smelling': 21920,\n",
       " 'aragorn': 12998,\n",
       " 'hawker': 52272,\n",
       " 'hawkes': 52273,\n",
       " 'explosions': 3975,\n",
       " 'loren': 8059,\n",
       " \"pyle's\": 52274,\n",
       " 'shootout': 6704,\n",
       " \"mike's\": 18517,\n",
       " \"driscoll's\": 52275,\n",
       " 'cogsworth': 40935,\n",
       " \"britian's\": 52276,\n",
       " 'childs': 34744,\n",
       " \"portrait's\": 52277,\n",
       " 'chain': 3626,\n",
       " 'whoever': 2497,\n",
       " 'puttered': 52278,\n",
       " 'childe': 52279,\n",
       " 'maywether': 52280,\n",
       " 'chair': 3036,\n",
       " \"rance's\": 52281,\n",
       " 'machu': 34745,\n",
       " 'ballet': 4517,\n",
       " 'grapples': 34746,\n",
       " 'summerize': 76152,\n",
       " 'freelance': 30603,\n",
       " \"andrea's\": 52283,\n",
       " '\\x91very': 52284,\n",
       " 'coolidge': 45879,\n",
       " 'mache': 18518,\n",
       " 'balled': 52285,\n",
       " 'grappled': 40937,\n",
       " 'macha': 18519,\n",
       " 'underlining': 21921,\n",
       " 'macho': 5623,\n",
       " 'oversight': 19507,\n",
       " 'machi': 25257,\n",
       " 'verbally': 11311,\n",
       " 'tenacious': 21922,\n",
       " 'windshields': 40938,\n",
       " 'paychecks': 18557,\n",
       " 'jerk': 3396,\n",
       " \"good'\": 11931,\n",
       " 'prancer': 34748,\n",
       " 'prances': 21923,\n",
       " 'olympus': 52286,\n",
       " 'lark': 21924,\n",
       " 'embark': 10785,\n",
       " 'gloomy': 7365,\n",
       " 'jehaan': 52287,\n",
       " 'turaqui': 52288,\n",
       " \"child'\": 20607,\n",
       " 'locked': 2894,\n",
       " 'pranced': 52289,\n",
       " 'exact': 2588,\n",
       " 'unattuned': 52290,\n",
       " 'minute': 783,\n",
       " 'skewed': 16118,\n",
       " 'hodgins': 40940,\n",
       " 'skewer': 34749,\n",
       " 'think\\x85': 52291,\n",
       " 'rosenstein': 38765,\n",
       " 'helmit': 52292,\n",
       " 'wrestlemanias': 34750,\n",
       " 'hindered': 16826,\n",
       " \"martha's\": 30604,\n",
       " 'cheree': 52293,\n",
       " \"pluckin'\": 52294,\n",
       " 'ogles': 40941,\n",
       " 'heavyweight': 11932,\n",
       " 'aada': 82190,\n",
       " 'chopping': 11312,\n",
       " 'strongboy': 61534,\n",
       " 'hegemonic': 41342,\n",
       " 'adorns': 40942,\n",
       " 'xxth': 41346,\n",
       " 'nobuhiro': 34751,\n",
       " 'capitães': 52298,\n",
       " 'kavogianni': 52299,\n",
       " 'antwerp': 13422,\n",
       " 'celebrated': 6538,\n",
       " 'roarke': 52300,\n",
       " 'baggins': 40943,\n",
       " 'cheeseburgers': 31270,\n",
       " 'matras': 52301,\n",
       " \"nineties'\": 52302,\n",
       " \"'craig'\": 52303,\n",
       " 'celebrates': 12999,\n",
       " 'unintentionally': 3383,\n",
       " 'drafted': 14362,\n",
       " 'climby': 52304,\n",
       " '303': 52305,\n",
       " 'oldies': 18520,\n",
       " 'climbs': 9096,\n",
       " 'honour': 9655,\n",
       " 'plucking': 34752,\n",
       " '305': 30074,\n",
       " 'address': 5514,\n",
       " 'menjou': 40944,\n",
       " \"'freak'\": 42592,\n",
       " 'dwindling': 19508,\n",
       " 'benson': 9458,\n",
       " 'white’s': 52307,\n",
       " 'shamelessness': 40945,\n",
       " 'impacted': 21925,\n",
       " 'upatz': 52308,\n",
       " 'cusack': 3840,\n",
       " \"flavia's\": 37567,\n",
       " 'effette': 52309,\n",
       " 'influx': 34753,\n",
       " 'boooooooo': 52310,\n",
       " 'dimitrova': 52311,\n",
       " 'houseman': 13423,\n",
       " 'bigas': 25259,\n",
       " 'boylen': 52312,\n",
       " 'phillipenes': 52313,\n",
       " 'fakery': 40946,\n",
       " \"grandpa's\": 27658,\n",
       " 'darnell': 27659,\n",
       " 'undergone': 19509,\n",
       " 'handbags': 52315,\n",
       " 'perished': 21926,\n",
       " 'pooped': 37778,\n",
       " 'vigour': 27660,\n",
       " 'opposed': 3627,\n",
       " 'etude': 52316,\n",
       " \"caine's\": 11799,\n",
       " 'doozers': 52317,\n",
       " 'photojournals': 34754,\n",
       " 'perishes': 52318,\n",
       " 'constrains': 34755,\n",
       " 'migenes': 40948,\n",
       " 'consoled': 30605,\n",
       " 'alastair': 16827,\n",
       " 'wvs': 52319,\n",
       " 'ooooooh': 52320,\n",
       " 'approving': 34756,\n",
       " 'consoles': 40949,\n",
       " 'disparagement': 52064,\n",
       " 'futureistic': 52322,\n",
       " 'rebounding': 52323,\n",
       " \"'date\": 52324,\n",
       " 'gregoire': 52325,\n",
       " 'rutherford': 21927,\n",
       " 'americanised': 34757,\n",
       " 'novikov': 82196,\n",
       " 'following': 1042,\n",
       " 'munroe': 34758,\n",
       " \"morita'\": 52326,\n",
       " 'christenssen': 52327,\n",
       " 'oatmeal': 23106,\n",
       " 'fossey': 25260,\n",
       " 'livered': 40950,\n",
       " 'listens': 13000,\n",
       " \"'marci\": 76164,\n",
       " \"otis's\": 52330,\n",
       " 'thanking': 23387,\n",
       " 'maude': 16019,\n",
       " 'extensions': 34759,\n",
       " 'ameteurish': 52332,\n",
       " \"commender's\": 52333,\n",
       " 'agricultural': 27661,\n",
       " 'convincingly': 4518,\n",
       " 'fueled': 17639,\n",
       " 'mahattan': 54014,\n",
       " \"paris's\": 40952,\n",
       " 'vulkan': 52336,\n",
       " 'stapes': 52337,\n",
       " 'odysessy': 52338,\n",
       " 'harmon': 12259,\n",
       " 'surfing': 4252,\n",
       " 'halloran': 23494,\n",
       " 'unbelieveably': 49580,\n",
       " \"'offed'\": 52339,\n",
       " 'quadrant': 30607,\n",
       " 'inhabiting': 19510,\n",
       " 'nebbish': 34760,\n",
       " 'forebears': 40953,\n",
       " 'skirmish': 34761,\n",
       " 'ocassionally': 52340,\n",
       " \"'resist\": 52341,\n",
       " 'impactful': 21928,\n",
       " 'spicier': 52342,\n",
       " 'touristy': 40954,\n",
       " \"'football'\": 52343,\n",
       " 'webpage': 40955,\n",
       " 'exurbia': 52345,\n",
       " 'jucier': 52346,\n",
       " 'professors': 14901,\n",
       " 'structuring': 34762,\n",
       " 'jig': 30608,\n",
       " 'overlord': 40956,\n",
       " 'disconnect': 25261,\n",
       " 'sniffle': 82201,\n",
       " 'slimeball': 40957,\n",
       " 'jia': 40958,\n",
       " 'milked': 16828,\n",
       " 'banjoes': 40959,\n",
       " 'jim': 1237,\n",
       " 'workforces': 52348,\n",
       " 'jip': 52349,\n",
       " 'rotweiller': 52350,\n",
       " 'mundaneness': 34763,\n",
       " \"'ninja'\": 52351,\n",
       " \"dead'\": 11040,\n",
       " \"cipriani's\": 40960,\n",
       " 'modestly': 20608,\n",
       " \"professor'\": 52352,\n",
       " 'shacked': 40961,\n",
       " 'bashful': 34764,\n",
       " 'sorter': 23388,\n",
       " 'overpowering': 16120,\n",
       " 'workmanlike': 18521,\n",
       " 'henpecked': 27662,\n",
       " 'sorted': 18522,\n",
       " \"jōb's\": 52354,\n",
       " \"'always\": 52355,\n",
       " \"'baptists\": 34765,\n",
       " 'dreamcatchers': 52356,\n",
       " \"'silence'\": 52357,\n",
       " 'hickory': 21929,\n",
       " 'fun\\x97yet': 52358,\n",
       " 'breakumentary': 52359,\n",
       " 'didn': 15496,\n",
       " 'didi': 52360,\n",
       " 'pealing': 52361,\n",
       " 'dispite': 40962,\n",
       " \"italy's\": 25262,\n",
       " 'instability': 21930,\n",
       " 'quarter': 6539,\n",
       " 'quartet': 12608,\n",
       " 'padmé': 52362,\n",
       " \"'bleedmedry\": 52363,\n",
       " 'pahalniuk': 52364,\n",
       " 'honduras': 52365,\n",
       " 'bursting': 10786,\n",
       " \"pablo's\": 41465,\n",
       " 'irremediably': 52367,\n",
       " 'presages': 40963,\n",
       " 'bowlegged': 57832,\n",
       " 'dalip': 65183,\n",
       " 'entering': 6260,\n",
       " 'newsradio': 76172,\n",
       " 'presaged': 54150,\n",
       " \"giallo's\": 27663,\n",
       " 'bouyant': 40964,\n",
       " 'amerterish': 52368,\n",
       " 'rajni': 18523,\n",
       " 'leeves': 30610,\n",
       " 'macauley': 34767,\n",
       " 'seriously': 612,\n",
       " 'sugercoma': 52369,\n",
       " 'grimstead': 52370,\n",
       " \"'fairy'\": 52371,\n",
       " 'zenda': 30611,\n",
       " \"'twins'\": 52372,\n",
       " 'realisation': 17640,\n",
       " 'highsmith': 27664,\n",
       " 'raunchy': 7817,\n",
       " 'incentives': 40965,\n",
       " 'flatson': 52374,\n",
       " 'snooker': 35097,\n",
       " 'crazies': 16829,\n",
       " 'crazier': 14902,\n",
       " 'grandma': 7094,\n",
       " 'napunsaktha': 52375,\n",
       " 'workmanship': 30612,\n",
       " 'reisner': 52376,\n",
       " \"sanford's\": 61306,\n",
       " '\\x91doña': 52377,\n",
       " 'modest': 6108,\n",
       " \"everything's\": 19153,\n",
       " 'hamer': 40966,\n",
       " \"couldn't'\": 52379,\n",
       " 'quibble': 13001,\n",
       " 'socking': 52380,\n",
       " 'tingler': 21931,\n",
       " 'gutman': 52381,\n",
       " 'lachlan': 40967,\n",
       " 'tableaus': 52382,\n",
       " 'headbanger': 52383,\n",
       " 'spoken': 2847,\n",
       " 'cerebrally': 34768,\n",
       " \"'road\": 23490,\n",
       " 'tableaux': 21932,\n",
       " \"proust's\": 40968,\n",
       " 'periodical': 40969,\n",
       " \"shoveller's\": 52385,\n",
       " 'tamara': 25263,\n",
       " 'affords': 17641,\n",
       " 'concert': 3249,\n",
       " \"yara's\": 87955,\n",
       " 'someome': 52386,\n",
       " 'lingering': 8424,\n",
       " \"abraham's\": 41511,\n",
       " 'beesley': 34769,\n",
       " 'cherbourg': 34770,\n",
       " 'kagan': 28624,\n",
       " 'snatch': 9097,\n",
       " \"miyazaki's\": 9260,\n",
       " 'absorbs': 25264,\n",
       " \"koltai's\": 40970,\n",
       " 'tingled': 64027,\n",
       " 'crossroads': 19511,\n",
       " 'rehab': 16121,\n",
       " 'falworth': 52389,\n",
       " 'sequals': 52390,\n",
       " ...}"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构造 word2idx 和 idx2word"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T10:53:29.517138Z",
     "start_time": "2025-01-23T10:53:29.493621Z"
    }
   },
   "source": [
    "# 将一个字典 word_index 中的每个单词映射到一个新的索引值，并将结果存储在新的字典 word2idx 中。\n",
    "#即假设word_index = {'apple': 0, 'banana': 1, 'cherry': 2}  执行代码后，word2idx 将是：word2idx = {'apple': 3, 'banana': 4, 'cherry': 5} \n",
    "word2idx = {word: idx + 3 for word, idx in word_index.items()}  # 0,1,2,3空出来做别的事,这里的idx是从1开始的,所以加3   \n",
    "word2idx.update({\n",
    "    \"[PAD]\": 0,  # 填充 token 统一序列长度\n",
    "    \"[BOS]\": 1,  # begin of sentence   开始\n",
    "    \"[UNK]\": 2,  # 未知 token        \n",
    "    \"[EOS]\": 3,  # end of sentence     结束\n",
    "})\n",
    "\n",
    "# 这里即将上面的word2idx变为 idx2word = {3: 'apple', 4: 'banana', 5: 'cherry'}\n",
    "idx2word = {idx: word for word, idx in word2idx.items()}  # 反向词典,id变为单词"
   ],
   "outputs": [],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "source": "print(word2idx[\"world\"])",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T10:53:31.998797Z",
     "start_time": "2025-01-23T10:53:31.995208Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "182\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "code",
   "source": "idx2word[4]",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T10:53:32.848440Z",
     "start_time": "2025-01-23T10:53:32.844525Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'the'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T02:52:21.918916Z",
     "start_time": "2025-01-23T02:52:21.261439Z"
    }
   },
   "source": [
    "# 选择 max_length\n",
    "length_collect = {}\n",
    "#统计样本中每个长度出现的次数\n",
    "for text in train_data:\n",
    "    length = len(text)  #句子长度\n",
    "    length_collect[length] = length_collect.get(length, 0) + 1  #统计长度的频率\n",
    "\n",
    "MAX_LENGTH = 500   #模型要输入定长的样本，不支持变长的。\n",
    "plt.bar(length_collect.keys(), length_collect.values())  #长度分布图\n",
    "plt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")  #画一条线，可以看到大部分都在500以内\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 24
  },
  {
   "cell_type": "code",
   "source": [
    "#想对句子长度画个直方图，看看长度分布\n",
    "length_list = [len(text) for text in train_data]\n",
    "plt.hist(length_list, bins=50)\n",
    "plt.xlabel(\"length\")\n",
    "plt.ylabel(\"frequency\")\n",
    "plt.axvline(500, label=\"max length\", c=\"gray\", ls=\":\")\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T11:01:01.050052Z",
     "start_time": "2025-01-23T11:01:00.395811Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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wJr0tNts9erVdjNr2bKle4xGobp429KlS+25Puobx3nDKA1yEhMTZePGje4xwedwjnHOcbalHvQcwRuyJu3j135n3YL7+wF4n34o1i04k7HewPW11GMKw3HshUj9IU3PGfya8z20xUR99NFHFrzpOCJtFNCeD20hCu7KUho8/Pzzz1avLVu2pKtOR44ckbp169q5gzc9X6dOnc5Zd6eeFysjz302UTPKVCNZXaBPB2o5qxfrG06b0oJp8KP7nGOCgyFnv7PvXMdokKORtQ72Sk37hrVJElmf/iP7+9//7pYBICvT8Tw6vujhhx92XwtutXFo44I2GGjgpN1v2jCgPSRpUadOHes203G5BQsWvKB66mBvHc/7448/WnCltNXpzz//PCPwiZaUKFHTQqTdYzfffLOUKVMmKppZtcvO2XS0PbImberWvmndmHYPIKvTcUWrVq2ycbDaYvPkk0+mGIzsdKlpL4iOq9UxRjobTB9TtyKdTefOnW0ck84s00HVOhZXxw49+uijsnv37jSdQ3t0NAjT2W46YFwDIy1rI0Rwy5p2jenYIG28SB0sZbaouEPogC8dB6QDwBx6A9NfnrYaBdNZZrrPOSb1rDPn+fmO0ag3VOuQ0tlouj94AwAg0rTFWycXdejQwQYr64Dr4NYiHcyss63HjRsnZcuWtde0/Pvvv1vwlBb58uWTb775xoao6PfSliVtadIxROm5H7733nvWI9OsWTObWq8tVTouSAeOO3R8r06o0rpee+21EkkxgSgYWKEDoN98801riXG6NbRlRgddT5kyxabbO4O0NOrUyFcHxelAMR3ZrjPUtGlP6bQ+fTNo/6kGNjrAWqdXOgO9lPaBHjhwQGbPnp2m+mn3muZB0DpFc3CUlmn1O0a3ET/Rpljnd6/Nxxfazw8gOulNWlswdPJM8I0W0Wf37t0W+GgDSIsWLTLlPZCe+3fEB1XoICmdPdatW7cUYzz0B9CINC4uzpJC6Q+is4QaNWpkwZDS/AyahVin440ZM8aa3HT6ouYu0mBI9erVy0bZDx482PpUFyxYYNMTZ80iJ49fAiLNxaH0vUJABACZY8GCBTZAWz+MasOF3oe1i0xbjKJRxAMijRR16mCohFE6NV7HfWgLkc780tlh2vTn0JubJmzSRFYaKOXPn98Cq5EjR7rHaMSowY/mNNJkWprQSnMhMOXeH/T9o33uThkAkDmSk5MtaeS2bdusq0wHg2vSyGhNfxIVXWbRji4zAIhOdJkhKUxdZnxkBgBkeXy2969AmH73BEQAgCzL6X4JXq8M/nLi/9IJXOwY0YiPIQIyug9bl29xBthHa981gAujN0FN4Oss66BTxoPz3MDbTp8+bYvs6u/9YpPvEhDB802pmmLBKQPwHifvXEavdYXopBNmNGfSxQbCBETwNP3EoOv8OGUA3qM3Ql38U/PRaasw/CVXrlxhmUXMHQK++OQAwB/dZ+Qaw4ViUDUAAPA9Wojg+QF3P/30k5V1PR6SMwIAQuHuAE87efKkfPLJJ7ZpGQCAUGghgucHW5YvX94tAwAQCgERPE3zDnXv3j3S1QAARDm6zAAAgO8REAEAAN+jywyepkna3nnnHSv36NGDpTsAACEREMHTdLmOffv2uWUAAEIhIIKn6XId9913n1sGACAU7hDwNE3EWKlSpUhXAwAQ5RhUDQAAfI8WInh+6Y6tW7dauXLlyizdAQAIibsDPE2X65gyZYptLN0BADgbWojgabpcR5kyZdwyAAChEBDB0zTvUM+ePSNdDQBAlKPLDAAA+B4BEQAA8D26zOD5pTvef/99K3fp0oWlOwAAIREQwdN0uY5du3a5ZQAAQiEggqfpch0dOnRwywAAhMIdAp6miRirVq0a6WoAAKIcg6oBAIDv0UIEzy/dsXPnTiuXK1eOpTsAACFxd4Cn6XIdkyZNso2lOwAAZ0MLETxNl+soXry4WwYAIBQCInia5h16+OGHI10NAECUo8sMAAD4HgERAADwPbrM4PmlOz766CMrd+zYkaU7AAAhERDB03S5jm3btrllAABCISCCp+lyHe3atXPLAACEwh0CnqaJGGvVqhXpagAAolzEB1X/97//lfvuu0+KFi0qefPmlZo1a8qqVavc/drNMXz4cCldurTtb9mypWzZsiXFOQ4cOCCdO3eWggULSuHChaVHjx5y5MiRFMesW7dOmjZtKnny5JGyZcvKmDFjMu1nBAAA0S2iAdGff/4pjRs3toGuX331lWzatElefPFFufTSS91jNHD517/+JePHj5fly5dL/vz5JTY2VpKSktxjNBjauHGjzJ07V2bOnCnffPONPPTQQ+7+xMREadWqlZQvX15Wr14tzz//vDz99NPy1ltvZfrPjMxfukODbt20DABAKDGBCI40HTp0qCxZskS+/fbbkPu1amXKlJEBAwbIwIED7bVDhw5JyZIlZeLEiTZr6KeffpLq1avLypUrpV69enbM7Nmz5ZZbbpHdu3fb17/xxhvy+OOPy969eyVXrlzu954xY4Zs3rz5jO97/Phx24IDKm1V0u+trVDRqsLQWec9ZsfoNuInJ06ckFGjRll52LBh7u8fAOB9iYmJUqhQoTTdvyPaQvT5559bEHP33XdLiRIl5Nprr5V///vf7v7t27dbEKPdZA79wRo0aCBLly615/qo3WROMKT0eB07oi1KzjHNmjVLcTPUVqb4+HhrpUpNb6D6fZxNgyFkTbpch/N7ZOkOAEBUBkQ6HVpbb6688kqZM2eO9O7dWx599FFbiFNpMKS0RSiYPnf26aMGU8F0NlGRIkVSHBPqHMHfI5i2JGg06Wy7du0K68+NzKPdsf369bONHEQAgKicZaZjOrRl55///Kc91xaiDRs22Hihbt26RaxeuXPntg0AAPhDRFuIdOaYjv8JVq1aNdm5c6eVS5UqZY/79u1LcYw+d/bpY0JCQor9J0+etJlnwceEOkfw9wAAAP4V0YBIZ5jpOJ5gP//8s80GUxUrVrSAZf78+SkGSOnYoEaNGtlzfTx48KDNHnMsWLDAWp90rJFzjM4802UcHDojrUqVKilmtMF7NDjWpTt00zIAAFEXEPXv31+WLVtmXWZbt26VDz/80KbC9+nTx/brIFgd+/Hss8/aAOz169dL165dbeZY27Zt3Ral1q1bS8+ePWXFihU2a61v3742A02PU506dbIB1ZqfSKfnf/zxxzJ27FiJi4uL5I+PTKCBsQbdujHtHgAQlWOI6tevL9OnT7dBzCNHjrQWoVdeecXyCjkGDx4sf/31l+UV0pagJk2a2LR6TbDomDx5sgVBLVq0sNll7du3t9xFDp1h9PXXX1ugVbduXSlWrJglewzOVQRvyp49u9x6661uGQCAqMtD5MU8BpFEHiIAALJgHiIAAIBowOKu8DRtAN2/f7+VixcvTnJGAEBItBDB03RmoSb/1C14liEAAMFoIYLn5cuXL9JVAABEOQIieJqmWxg0aFCkqwEAiHJ0mQEAAN8jIAIAAL5Hlxk8TZfr0Czn6vbbb5ccOXjLAwDORAsRPE2X69AlX3Rj6Q4AwNnwcRmepst1xMbGumUAAEIhIIKnaRDUsGHDSFcDABDl6DIDAAC+RwsRPL90hy7qp3SBP5buAACEQgsRPE2X6xg7dqxtLN0BADgbWojgeTlz5ox0FQAAUY6ACJ5fuuMf//hHpKsBAIhydJkBAADfIyACAAC+R5cZPL90x5dffmnlW265haU7AAAh0UIET9PlOn788UfbWLoDAHA2fFyG5zNVN2/e3C0DABAKARE8TYOgZs2aRboaAIAoR5cZAADwPVqI4PmlO44ePWrlfPnysXQHACAkWojgabpcxwsvvGAbS3cAAM6GgAgAAPgeXWbw/NIdTz31VKSrAQCIcrQQAQAA3yMgAgAAvkeXGTy/dMe8efOs3LJlS5buAACERAsRPE2X61i+fLltLN0BADgbPi7D85mqmzRp4pYBAAiFgAiepkFQixYtIl0NAECUo8sMAAD4Hi1E8PzSHU6G6pw5c7J0BwAgJFqI4GkaDI0aNco2lu4AAJwNAREAAPA9uszgadpNNmzYMLcMAEDUtRA9/fTTNqYjeKtataq7PykpSfr06SNFixaVAgUKSPv27WXfvn0pzrFz505p06aN5MuXT0qUKCGDBg2yZHzBFi1aJHXq1JHcuXNL5cqVZeLEiZn2MyKy9D2l65npxvghAEDUdpldffXVsmfPHnf77rvv3H39+/eXL774QqZNmyaLFy+W3377Te688053/6lTpywYOnHihHz//fcyadIkC3aGDx/uHrN9+3Y7pnnz5rJmzRrp16+fPPjggzJnzpxM/1kBAEB0iniXmS6lUKpUqTNeP3TokLzzzjvy4Ycfyk033WSvTZgwQapVqybLli2Thg0bytdffy2bNm2ypRlKliwptWvXlmeeeUaGDBlirU/aKjB+/HipWLGivPjii3YO/XoNul5++WWJjY3N9J8XmUuDZm0hVDfeeCPJGQEA0dlCtGXLFilTpoxcccUV0rlzZ+sCU6tXr7ZZQbr+lEO708qVKydLly615/pYs2ZNC4YcGuQkJibKxo0b3WOCz+Ec45wjlOPHj9s5gjdk3YBIA2DdtAwAQNQFRA0aNLAurtmzZ8sbb7xh3VtNmzaVw4cPy969e62Fp3Dhwim+RoMf3af0MTgYcvY7+851jAY5x44dC1kvnaJdqFAhdytbtmxYf25knmzZstn7TDctAwAQdV1mN998s1uuVauW3bTKly8vU6dOlbx580as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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "markdown",
   "source": [],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "source": [
    "length_list[0:10]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T11:01:03.552232Z",
     "start_time": "2025-01-23T11:01:03.546934Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[218, 189, 141, 550, 147, 43, 123, 562, 233, 130]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:03:17.873993Z",
     "start_time": "2025-01-23T11:03:17.869751Z"
    }
   },
   "cell_type": "code",
   "source": [
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "raw_text"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['hello', 'world'],\n",
       " ['tokenize', 'text', 'datas', 'with', 'batch'],\n",
       " ['this', 'is', 'a', 'test']]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": "## Tokenizer（分词器）"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:12:10.689716Z",
     "start_time": "2025-01-23T11:12:10.121585Z"
    }
   },
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx  #词表,单词到id\n",
    "        self.idx2word = idx2word  #词表，id到单词\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx  #填充    0\n",
    "        self.bos_idx = bos_idx  #开始    1\n",
    "        self.eos_idx = eos_idx  #结束    3\n",
    "        self.unk_idx = unk_idx  #未知，未出现在最高频词表中的词    2\n",
    "\n",
    "    def encode(self, text_list):\n",
    "        \"\"\"\n",
    "        将文本列表转化为索引列表\n",
    "        :param text_list:当前批次的文本列表\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        max_length = min(self.max_length, 2 + max(\n",
    "            [len(text) for text in text_list]))  #最大长度，最大长度是500，但是如果句子长度小于500，就取句子长度（句子长度是本组句子中最长的），2是为了留出开始和结束的位置。如果长度小于500，取长度加2，如果长度大于500，就取500。\n",
    "        indices = []\n",
    "        for text in text_list:\n",
    "            index = [self.word2idx.get(word, self.unk_idx) for word in text]  #单词转化为id，未知的词用unk_idx代替\n",
    "            index = [self.bos_idx] + index + [self.eos_idx]  #添加开始和结束\n",
    "            if len(index) < max_length:\n",
    "                index = index + [self.pad_idx] * (max_length - len(index))  #填充0\n",
    "            else:\n",
    "                index = index[:max_length]  #如果句子长度大于500，就截断\n",
    "            indices.append(index)\n",
    "        return torch.tensor(indices)  #二维列表转化为tensor\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        \"\"\"\n",
    "        将索引列表转化为文本列表\n",
    "        :param indices_list:某批次的索引列表\n",
    "        :param remove_bos:\n",
    "        :param remove_eos:\n",
    "        :param remove_pad:\n",
    "        :param split:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":   #开头\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":   #结尾\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":   #填充\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text)  #encode支持批量处理\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 4825,  182,    3,    0,    0,    0])\n",
      "tensor([    1,     2,  3004,     2,    19, 19233,     3])\n",
      "tensor([   1,   14,    9,    6, 2181,    3,    0])\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:18:09.550393Z",
     "start_time": "2025-01-23T11:18:09.545918Z"
    }
   },
   "cell_type": "code",
   "source": [
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)  #改成True就没有了\n",
    "print(\"decode text----------\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "decode text----------\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with batch [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "execution_count": 26
  },
  {
   "cell_type": "code",
   "source": [
    "train_data[0:1]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T11:18:14.395688Z",
     "start_time": "2025-01-23T11:18:14.390733Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([list([1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32])],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:19:58.202300Z",
     "start_time": "2025-01-23T11:19:58.198Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_data[0:1])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:20:08.004802Z",
     "start_time": "2025-01-23T11:20:08.000813Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_data[0:1][0])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "list"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 40
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:20:23.852797Z",
     "start_time": "2025-01-23T11:20:23.847321Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_data[:1])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 41
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:19:17.612704Z",
     "start_time": "2025-01-23T11:19:17.608188Z"
    }
   },
   "source": [
    "# 看看训练集的数据\n",
    "tokenizer.decode(train_data[0:1], remove_bos=False, remove_eos=False, remove_pad=False)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[\"[BOS] this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert [UNK] is an amazing actor and now the same being director [UNK] father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for [UNK] and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also [UNK] to the two little boy's that played the [UNK] of norman and paul they were just brilliant children are often left out of the [UNK] list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 35
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集与 DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:28:53.728301Z",
     "start_time": "2025-01-23T11:28:51.750039Z"
    }
   },
   "source": [
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "class IMDBDataset(Dataset):\n",
    "    def __init__(self, data, labels, remain_length=True):\n",
    "        if remain_length:  #字符串输出样本中，是否含有【BOS】和【EOS】，【PAD】   这里要先将样本转化成文本，因为直接用样本的话里面有UNK\n",
    "            self.data = tokenizer.decode(data, remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "        else:\n",
    "            # 缩减一下数据\n",
    "            self.data = tokenizer.decode(data)\n",
    "        self.labels = labels\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        text = self.data[index]\n",
    "        label = self.labels[index]\n",
    "        return text, label\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.data)\n",
    "\n",
    "\n",
    "def collate_fct(batch):\n",
    "    \"\"\"\n",
    "    将batch数据处理成tensor形式\n",
    "    :param batch:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    text_list = [item[0].split() for item in batch]  #batch是128样本，每个样本类型是元组，第一个元素是文本，第二个元素是标签\n",
    "    label_list = [item[1] for item in batch]\n",
    "    text_list = tokenizer.encode(text_list).to(dtype=torch.int)  # 文本转化为索引\n",
    "    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n",
    "\n",
    "\n",
    "train_ds = IMDBDataset(train_data, train_labels)\n",
    "test_ds = IMDBDataset(test_data, test_labels)"
   ],
   "outputs": [],
   "execution_count": 42
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T11:32:06.725187Z",
     "start_time": "2025-01-23T11:32:06.720676Z"
    }
   },
   "source": [
    "# collate_fn是将文本再次转换成索引。在这里的话就能保证每一个批次都是它自己的最大长度，提高效率。\n",
    "batch_size = 128\n",
    "train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)  #collate_fn是处理batch的函数\n",
    "test_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)"
   ],
   "outputs": [],
   "execution_count": 47
  },
  {
   "cell_type": "code",
   "source": [
    "#要看到每个batch的长度不同，需要修改batch_size为12\n",
    "i=0\n",
    "for text, label in train_dl:\n",
    "    print(text.shape, label.shape)\n",
    "    i+=1\n",
    "    if i==50:\n",
    "        break"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T11:32:09.046349Z",
     "start_time": "2025-01-23T11:32:08.147649Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n"
     ]
    }
   ],
   "execution_count": 48
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义模型"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "(128,500,10000)"
  },
  {
   "cell_type": "code",
   "source": [
    "# target output size of 5\n",
    "m = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化\n",
    "input = torch.randn(1, 3, 9)\n",
    "output = m(input)\n",
    "output.size()  #可以看到最后一维变成了1"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-23T12:55:29.573911Z",
     "start_time": "2025-01-23T12:55:29.569322Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 3, 1])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:13:15.462715Z",
     "start_time": "2025-01-23T13:13:15.267028Z"
    }
   },
   "source": [
    "class AddingModel(nn.Module):\n",
    "    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size):\n",
    "        super(AddingModel, self).__init__()\n",
    "        self.embeding = nn.Embedding(vocab_size, embedding_dim)  # 词嵌入 vocab_size要和词典大小一致 Embedding要把词变成密集向量，先把id转化成独热码(这里就把(500,)变成了(500,10000))，把每个样本的原来的尺寸(1轴和2轴)(128,500)变成(128,500,10000),然后再用embedding层将(500,10000)乘以(10000,16)把它变成(500,16)(这个16是超参数)   embeding层没有偏置\n",
    "        self.pool = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化,对应tf是全局平均值池化  1d是 默认把最后一维变成1。\n",
    "        self.layer = nn.Linear(embedding_dim, hidden_dim)  # 全连接层\n",
    "        self.fc = nn.Linear(hidden_dim, 1)  # 全连接层\n",
    "\n",
    "    def forward(self, x):\n",
    "        # [bs, seq length] [128, 500]  [128,500,10000]--->[128,500,16]   一批有128个样本，一个样本500个词，每个词为长度为16的向量\n",
    "        x = self.embeding(x)\n",
    "        # [bs, seq length, embedding_dim]-->[bs, embedding_dim, seq length]，尺寸[128,500,16]--》[128,16,500] 因为全连接只能对二维用，所以我们将500和16换位，变成(128,16,500)，然后经过自适应平均池化把500变为1，然后再将1舍去，变成 \n",
    "        x = x.permute(0, 2, 1)\n",
    "        x = self.pool(x)  # 每个样本变为一个密集向量，在seq_length维度上进行平均池化，[128,16,500]-->[128,16,1]\n",
    "        x=x.squeeze(2)  # [bs, embedding_dim, 1] ->[bs, embedding_dim]  把长度为1的那个轴去掉\n",
    "        # [bs, embedding_dim] -> [bs, hidden_dim]\n",
    "        x = self.layer(x)\n",
    "        x = self.fc(x)  # [bs, hidden_dim] -> [bs, 1]\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "for key, value in AddingModel().named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            embeding.weight             paramerters num: 160000\n",
      "              layer.weight              paramerters num: 1024\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n"
     ]
    }
   ],
   "execution_count": 58
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [
    {
     "data": {
      "text/plain": "1024"
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "16 * 64"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-04-30T08:35:46.539885600Z",
     "start_time": "2024-04-30T08:35:46.501910500Z"
    }
   }
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:11:46.199493Z",
     "start_time": "2025-01-23T13:11:45.437480Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        # 二分类\n",
    "        preds = logits > 0   # True就是1分类，False就是0分类\n",
    "        # 之前是preds = logits.argmax(axis=-1)    # 验证集预测\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 53
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### TensorBoard 可视化\n",
    "\n",
    "\n",
    "训练过程中可以使用如下命令启动tensorboard服务。\n",
    "\n",
    "```shell\n",
    "tensorboard \\\n",
    "    --logdir=runs \\     # log 存放路径\n",
    "    --host 0.0.0.0 \\    # ip\n",
    "    --port 8848         # 端口\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T06:21:50.661437Z",
     "start_time": "2025-01-23T06:21:50.200639Z"
    }
   },
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ],
   "outputs": [],
   "execution_count": 44
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save Best\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:11:52.989588Z",
     "start_time": "2025-01-23T13:11:52.984218Z"
    }
   },
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ],
   "outputs": [],
   "execution_count": 54
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:11:55.881029Z",
     "start_time": "2025-01-23T13:11:55.877209Z"
    }
   },
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ],
   "outputs": [],
   "execution_count": 55
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:15:25.504890Z",
     "start_time": "2025-01-23T13:13:21.345014Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(\n",
    "        model,\n",
    "        train_loader,\n",
    "        val_loader,\n",
    "        epoch,\n",
    "        loss_fct,\n",
    "        optimizer,\n",
    "        tensorboard_callback=None,\n",
    "        save_ckpt_callback=None,\n",
    "        early_stop_callback=None,\n",
    "        eval_step=500,\n",
    "):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits > 0 #当sigmoid输出大于0.5时，预测为1，否则预测为0，这里大于0，刚好sigmoid的值是0.5，预测为1\n",
    "\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                        )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20\n",
    "\n",
    "model = AddingModel()\n",
    "\n",
    "# 1. 定义损失函数 采用二进制交叉熵损失, 先sigmoid再计算交叉熵\n",
    "loss_fct = F.binary_cross_entropy_with_logits   # 这个是函数\n",
    "# loss_fct =nn.BCEWithLogitsLoss()    #这个是类，类有()\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "# tensorboard_callback = TensorBoardCallback(\"runs/imdb-adding\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-adding\", save_step=len(train_dl), save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=5)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    test_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_dl)\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/3920 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "158863e170734ce88ee8340a2350ec1c"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 14 / global_step 2744\n"
     ]
    }
   ],
   "execution_count": 59
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:15:32.045947Z",
     "start_time": "2025-01-23T13:15:31.598414Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record, sample_step=10)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAHACAYAAABqJx3iAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQeYG9XVhj+V1fb1er3uvfeGG8Z0XMD0HnoSeg0lCRBCJ/An1CRASOiB0DvYGIPBYNxx7717be96e9NqJf3PuaMr3RnNaLXrLdLqvM+jlXY0M7qjer8553zH5vf7/WAYhmEYhmEYhmlF2Ft6AAzDMAzDMAzDMI0NCx2GYRiGYRiGYVodLHQYhmEYhmEYhml1sNBhGIZhGIZhGKbVwUKHYRiGYRiGYZhWBwsdhmEYhmEYhmFaHSx0GIZhGIZhGIZpdbDQYRiGYRiGYRim1eFEHODz+bB//35kZmbCZrO19HAYhmESBuopXVZWhi5dusBu53NjEv5dYhiGif3fprgQOvRj0r1795YeBsMwTMKyZ88edOvWraWHETPw7xLDMEzs/zbFhdChM2byYLKysuq9vcfjwezZszF16lQkJSWhtcLH2fpIlGNNlOOMx2MtLS0VE3r5Pcxo8O9S9CTKsSbKcSbSsfJxxv9vU1wIHZkWQD8mDf1BSUtLE9vGywvYEPg4Wx+JcqyJcpzxfKycnqWHf5eiJ1GONVGOM5GOlY8z/n+bOOGaYRiGYRiGYZhWBwsdhmEYhmEYhmFaHSx0GIZhGIZhGIZpdcRFjQ7DMLFr71hbWwuv13vE+cFOpxPV1dVHvK9YJ9aO1eFwiPFwDU7zfj5i7X3QlMTjsfLngmFaByx0GIZpEDU1NcjLy0NlZWWjTAg7deokHKxa+8QiFo+VilA7d+4Ml8vV0kNJmM9HLL4Pmop4PVb+XDBM/MNCh2GYBjVL3LFjhzjrSc26aCJwJBMY2l95eTkyMjJafVPKWDpWmoDShDw/P1+8nv3792/xMSXK5yOW3gdNTbwdK38uGKb1wEKHYZh6Q5MAmryQhz2d9TxSaF+0z5SUlFY/oYi1Y01NTRV2ort27QqOi2n6z0esvQ+akng8Vv5cMEzroEHfOC+88AJ69eolPvgTJkzAkiVLLNc98cQTxZks4+X0008/knEzDBMDxMukhYkMv45NAz+v8Q2/fgwT/9T7U/z+++/jzjvvxIMPPojly5dj5MiRmDZtGg4dOmS6/ieffCLylOVl7dq1Ipx/4YUXNsb4GYZhGIZhGIZhjlzoPPPMM7j22mvxm9/8BkOGDMFLL70kQvOvvfaa6fo5OTmiCFFevv32W7E+Cx2GYRiGYRiGYWKiRofyVJctW4Z7771XF9qdPHkyFi5cGNU+Xn31VfzqV79Cenq65Tput1tcJKWlpUGLSrrUF7lNQ7aNJ/g4Wx+xeqw0HirYpdx7uhwptC953Rj7ay769OmD3/3ud+JypMc6d+5cnHLKKTh8+DCys7PRnNA4aDz0ulLEXSXW3ntM/EAp7rfffjtuu+22lh4KwzAJSr2ETkFBgfDA79ixo245/b9x48Y6t6daHkpdI7ETiSeeeAIPP/xw2PLZs2cfUeEzRZMSAT7O1kesHSv1l6AILTkp0QmQxqKsrAxNzRlnnIHhw4eL75kj5bvvvhPfSfJkzJEcq7QhpuXNXRtAr2FVVRV++ukn0ffFbFxMYkB1taNGjcJzzz13xPtaunRpxJOaDMMwrcp1jQQOTTDGjx8fcT2KGFEdkIQmEeReM3XqVGRlZdX7cemMJE0Up0yZIlxUWit8nK2PWD1WavxHPTHILrYx3IgomkAT/MzMzCbvs0Eijex+rb5LaCx0QofWq4uGfB9ZHas8iUPLG7LfI309yWXq+OOPD3s9GyLimNZLfT4f7du3F9fxFKVlGKZ1Ua/Thrm5uSKt4eDBg7rl9D+d3Y1ERUUF3nvvPVx99dV1Pk5ycrL4oVcvBE306n2xA0ke7YdaXb7xYCV++9/leHPRHlR5tckPLS+s8uKdpfvg8dsa9ngtfGnw8xRnl0Q5zlg+VpqkU+SBLnS7utbX4EuVx4uqGq+4ru+26jjquvz2t7/Fjz/+iH/84x/iu4wu//3vf8X1N998g3HjxokJ/4IFC0T/jHPPPVc0DKTvIHKY/P7773X7o9Q12pf8n/ZD9Yrnn3++EIEDBw7EV199pdtGihuzcYsvZeX/Tz/9VJwcojHRYz377LO6+6lGkh5DNja86KKLgveREQyZxdAZdZpw0okiitpYPTc0nkjvQebIBUJlTa3uQu9547KmuMh0ybr49a9/LT4ff//734MOqW+88Ya4/vrrrzFmzBjx+/zzzz9j27ZtOPvss0VGB73X6bNDEU5j6poaGaLPxyuvvCI+V/Sepf40X3zxRVRjI3FF84fevXuLzwO972mcRujzN3ToUDFO+kzccsstwfuKi4tx/fXXizGToB82bJj4fDJMPLL1UBmueHUxlu4sRCxQWu3BNW8uxecr9yFuIzp0FpS+6ObMmYNzzjkneKaG/le/TMz48MMPRd3N5ZdfjuZk+eK5OGr2BRjl74glm95E12HHIbPfRFz/QRH2l/swb0sBHpuxAZMHd8CLl43B/Z+txez1B8XyKyf2xNAuWWiXkdysY2aYeIMEypAHvmmRx17/yDSkuaL7KqOJ0ebNm8UE55FHHhHL1q1bJ67vuecePPXUU0JQtG3bVkSspk+fjr/85S9i0kSC6Mwzz8SmTZvQo0cPy8egtNu//e1vePLJJ/HPf/4Tl112mejFQcYs9YHqIUm4PPTQQ7j44ouF+LrpppvQrl07MSH95ZdfRO3DW2+9hWOOOQaFhYWYN2+e2JYcLi+55BIxDppUUgSJ7ot2wssk5mcklj8fNNfo1q2bmEvQZ4A+D9ddd11Q4BP/+te/RDbI//3f/+G0005DSUkJ5s+fH9yeltFn4e2330bfvn2xfv36sJo0hokXvl5zQMxVczOSMa5X/X5fmoL//Lgd3204JC5nj+qKuE1doy+Rq666CmPHjhUpaHS2hqI15MJGXHnllejatWtY/julrZE4oi+o5sR5eJO47mk7iJ6VB4Elc4AlwPf+JKxx9cZ6+wAsrumDFRv6475PkoTIIb7bcFBc+nXIwIzbjkWyk78MGSbeadOmjThhQ2eTZRRa1hfSxI5SBCU08aKIiOTRRx8VERY6Ax3pxA6JEBIZxOOPPy4iPlSfeOqpp9bb4ZLMCe6//37x/4ABA8TEjCaI9Bi7d+8W0RqqOaJ0t549e2L06NFBoUO1Nuedd55YTlBkiGHi9fNBkUW1dpciO2SC9MEHHwSFzmOPPYa77rpLZw5CkSaCok30OBs2bBCfJYJEG8PEK9W1XnG9v7gKsUBxVePV67ao0KEzi/n5+XjggQdw4MABUbQ4a9asoEEB/fgaC2npDA+FuslMoLnpN+0GbB12BtbNfgtp3sNIyluOUfatyLZVYJxtM8ZhM65yaeseWNcWJyf1wwofXfpjjb83th4CXpq7Hd3apmLZ7iLcc9ogZKWEUjk+W7EPhytqcPWxvZv92BgmVkhNcoizxg2FzraWlZYhMyuz3oX49NiNAZ28USGjBYqmzJgxIygcKPWLvuMiMWLEiOBtEiKU9mbVZywSNCGj1CCVSZMmiZNLlMZDk04SMTRZo0kiXWRKEE1ASSSRuKE+Z5S2dsEFF4gz8UxsfEaO5D3fkMduDZ8PalZOqWn0GPRYZKJBcxCC9rF//37xvjdj5cqVIiIkRQ7DxDtuj1b7lldSjVjAGaMNdhtkRkBna6zO2JBFqhHKpW2plAkK1/fs1hXrOo3AidOnY/X+MnyxrxgX96lB8oEVwN6l4uI7sA6dbEU4zbFUXAifzYH13u5YMbcf5pP48ffHM3YbHjp7mLifcp9vf3+luH3CgFz065DZIsfIMC0N5fBHmz5mBk36al0OsY+W6kZudIf6/e9/L4wgKF2nX79+oi6AxEJdLnPGmhZ6bpqiGJuiONS0mb5z6SQSnXyiiSc5XZE9NY2d0nvoPkoRuu+++7B48WJxJpxp+c9ILLzn4+nzQTW+9JhPP/00Jk6cKN7/FN2k9zRBjx+Juu5nmHijxiuFThV8Pj/s9qY18qkLZws/fky4rsUCY3rmiIug0yBglBZCt9VU4JMZM+HeuQjnd8yDK2857GV5GGbfKS5XQCuyLFqegQP7RmNf+lAczh6BLDhRigzsKawKCp3lu4vQMyeNa3sYJgah1ByKiNQF5fZTmg1FSeQZ7J07d6K5GDx4cLC+QB0TnZGWdQVkokJ9zOjy4IMPCoFDhgmUskYTSIoA0YVEEEV/KLVIdbRkmHj5fNDjUS0a1alJyBBBQsKHzA+oZvikk04yjSTt3btX1CBxVIdpDdTUakLH4/WjoMKNDplH7oAaiUOl1Xjhh624/Oie+GbdAXRrm4ZzRodqcRwOFjoxjc2VjvPOvRAAXQKU7BPRnrx185B6aDnSDq9FW5QDh+ahE7Si3xXJNjxY+2tsyx+M3rnpKCh344KXFuK4/rl46+oJLXdADMOYQpMhOgtMkzJyi7I6m0yOUORcRgXWJBqoVqY5bXKp1oDqC6j2gVKGqR7h+eefx4svvijuJ7eo7du3C0toSkmbOXOmGB9F0On4aMJHKWsdOnQQ/1PKMYknhonHzwc9HhkekDsiRSXJhIOil2qEkiKaN9xwg3jPS+MBEki33norTjjhBPFZIUdEqn+jKBTVH9HY61s/xzCxJHSIvOLqJhc6f/hoNX7cnI83F+4KLlOFTqxGdGI/Xt6StOkKDD0HnS96Gtm3/IDaP+7GK4Nfx/2eX+MT77HY4esIh82P+5z/wyszfsaJT83FQ19qDjULth1GuVvfeI9hmJaH0l8oIjJkyBBhu2xVU0CTIRIQdBaZJnNU63LUUUc12zjpsajQmlJ2yAWLojJUEE5n0QmK3tBE8+STTxYChqym3333XWGtS3UP1PyTXLHo7PWf//xnkfJDkz+GicfPB9lCU6SSRD9ZvR8+fFgX3SHIKIlq2OhkAH0OyKhjy5Ytwfs//vhjcfKAzBDo+P74xz9GFb1imFjErQqdkqY3JFizryRsWbXHa1qj4wmk1cUCHNGpB2mpqbjm4vPgv+hc3P3xatz5yx6873oUE+wb8Yek93GX5yas3af17PH6/Fi6oxAnDerQ0sNmGEaBJv4UHVGR4sF4ZpvSwFRuvvlm3f/GVB2zWkTq3RFtR3rj9nT2mS5mHHvssaY1kQQJHzKJYZhY+HzISA+JCmM9UrSfD7Kwfv3118VFxejwSoKILmaQUxyZGTBMaxM6+4ub3pDA5QiPjRRV1qBzm9SwiA4JoCST9VuC2BhFnEGh7nNHd6NbeMyj9QU63/EzRthC+cLEgm0FLTRChmEYhmEYprWbETRXRMflNBE6FZ7gbdUMgfqGxQosdBrIxL7t8OQFI3DZuWfjY+9xYtmfk96mc7rBdX7aXCCcMBiGYah2gGoeKK2MbG7pmv6nC93HMImM/HyYXfjzwUg+X7kPy3YVoTUzf2sB/jZrI/63eFdEx2K3Iib219Ni2uvz4+1Fu7DlYJnlOl+u2o8lOwqx8UAp3l2yG0kmZgPFlTWm6WrVNZy61iq4cGx3IWQmfnIxptsXY7x9E06zL8GKjBNQWFmDTQfL8Ox3m3HX1IEtPVSGYVoYqq+h+gdK4yGHKprAyTQeEj0Mk8jIz4cZ/PlgiBW7i/C797SWHjv/73S0Vm54exnKqrUa70GdMkNOwZEiOvVsGrpgWwH+/NlaHNsvF29fE26ctS2/HLe+u6LO/dBcV1Lr9Yc1M40FWOgcIRSqO4gc/Nt7Bm53foJ7ne/glYFnYXjPjsKh4vkftuKyCT3RqU3TumEwDBPbkBMUXUjolJaWislbPPRPYZjm/HwwjBWbI0QfWgsUaZEiR9bejOkZhetaPSM6BeVucU0N703vL9Pur4uiSo9pRKeqJnaEDv/KNgIfXD8RScfdAX9GZ/Sw5+PenJ9EtIeUOEUdyamC1PHlryzGwm2HW3q4DMMwDMMwcUUsTZ6bClW8yGL/aNY9WFqN2no4nVUGnks1/U0lJUnr1VYXRYpQon4+Eq7RaWWM752Dm6eNgG3yg+L/1EXPAuX5GNqljfh/3f4S3PbuCvy8tQCXvbKohUfLMAzDMAwTX1R5Yqfuo6lQ09GMxf6RXNeoHPxQlFEYotLtjShIorWHVoVYrdJHS7WdbmlY6DQmIy4GOo8C3KXA3McxpIuWV7x+fynW7ddsp9mbgGEYhmGY5oaK+PcWVSJeiaUoQTT1RB/8sgdrTXrPNEVEx8x5jYwM5m8tCKapqVTU1AYFyfb88uAc1WrfVhTrUteUGp0Ir9WOggqs2Vu/5+VIYKHTmFC+/bTHtdvL3sCY1APipvENxDAMwzAM01zsK67CBS8twPVvLUO8oqZZRXIja2nyy9y44KWF+ONHq8VzXlGP5vHGSEpEoRNYNzstybSXzi+7inDZK4tx7ydrLNMASTxe8vIiXPTyEiilQXBHGdEp1KWuqREd6+1Pemouznz+Z5Fu1xyw0Glsek0CBp8J+H0YuvZvwS8YlZIq61AkwzAMwzBMY3KgpFrUDNN1a4joqNGDWIMm8GQqICf8xfWY84VHdDx1rtuzXbppRGdfkfa/vDaP6PhwsNQt9lWuCp0o0wRVe2m1Rsgq+qa2XKHa9eaAhU5TMOURwOFC0o7vcX7WhrC79xTGb+iYYRId6gj/3HPPRd1c+LPPPmvyMTFMPH4+mObDHbD7jTYlKRZR06HUepBYw5i2VZ/n3BjRUYWE1Wvaq12aaURHipnKwLWZGYFunF7rWqFo7KU9ioixMo5Q64qkGGxqWOg0BTl9gAnXi5v3Of8HB/QveDznyDIMwzAME1/ICaY60YxnM4JYjugYoxlSkESDUWCoqWHGyIh8DqwiOlJsVJqIDmlGoKIGcaKu0VHMEjzKNlZ9dFQRGK3hwZHCQqepOO73QFo75FRux7N9V8BmA7JStLZFN7y9HL//cFVLj5BhGIZhmDiFJo1mdQ4llZ6wSICsb6GJdF31LXSmPRYzT6qUyER9rJSjgUoKpKig52f34cqIzxOdsLYSA8b6lPpEdIzrymL/XYcr8MvOQpQH6n1UQdQ7N03XS8cXeP0q3NZCR0Z7dI/ts9V7zGXu2qBgqVUiNNUWER1VBJqNqylgodNUpGYDJ94rbp5V9CbW3Xs0Lj861PXpo2V74zqEzDA66AehpuLILp7Khm1Xj6LU//znP+jSpYto2qly9tln47e//S22bdsmbnfs2BEZGRkYN24cvvvuu0Z7mtasWYPJkyejc+fOaN++Pa677jqUl4fylOfOnYvx48cjPT0d2dnZmDRpEnbt2iXuW7VqFU466SRkZmaKZqNjxozBL7/80mhjY1rgM9LQ93wTfUaa+/PxzDPPYPjw4eL93r17d9x00026zwMxf/58nHjiiUhLS0Pbtm0xbdo0FBUViftonH/729/Qr18/JCcno0ePHvjLX/6CROHa//6CSf/3ve5MPomUkY/MxqhHvtWdPVcjOXWlJT0xcwOO+9sPwrErlpAT98ZOeyJBM/GJOTjq0W+FccAbC3bi+Cd/wOMzw0sPiNV7i3HsX3/APZ+sjiqiU7/UNe242qW7xDUJm+W7i3DCk3OFwcFFLy0Mew1lREemrj3z7Wbx+n25en8wdc0o2sxSy2p8DYtCyV46nihqdNTlamPUpkQLMTBNw5jfAEteBgo2IW3Rs+jU5hrd3VQU2COQW8kwcQ1N2B7vckRnXLIbuvGf9gMu7Yu+Li688ELceuut+OGHH3DKKaeIZYWFhZg1axZmzpwpJlnTp08XkyWaOP33v//FmWeeiU2bNolJ1JFQUVEhJmlHH3005syZg8rKSiF0brnlFrzxxhuora3FOeecg2uvvRbvvvsuampqsGTJElHnQ1x22WUYPXo0/vWvf8HhcGDlypVIStLcdpj4+4wc0Xu+iT4jzf35sNvt+Mc//oHevXtj+/btQuj88Y9/xIsvvijup/c4jYNE1t///nc4nU4xNq9Xmyzde++9ePnll/Hss8/i2GOPRV5eHjZu3IhEYeuhcnEWnaIPndukimXyjD9B0R45CVaLy2niney0bgi55VB5sFh8Ur9cxAplbiVNqhGFDk2+ZXSBjv0vMzSB8/K8Hfjj1P5h62/I05x0V+0pNt2fMZrRkIhOuwyXcFyjw/xxU37w/vV5pUKEqK9nl8BrT+uToNl4oCz4/iBoHyR01SagFTVHnrpGWUql1bXCzKBDVgpqdfbS5turAquchU4rwOEEpv0F+N8FwKKXcPwlv4LDbgueiSA3NhY6DNN80Bnh0047De+8805wIvfRRx8hNzdXREto4jVy5Mjg+o8++ig+/fRTfPHFF0KQHAn0mNXV1XjzzTfFRI2iMs8//7yYKP71r38VoqWkpARnnHEG+vbtK7YZPHhwcPvdu3fjD3/4AwYNGiT+798//AeYYeLp83H77bfrTAwee+wx3HDDDUGhQ9GasWPHBv8nhg4dKq7LysqE+KHP0FVXXSWW0eeGBE+iIKM06tl93URSET3qGXraLjPifr31ct5qLtSJcWOmrqn7JbFAgkB97oxIJzRKFSNhIU9GWdWn1KcuSkZFSIhmp7lEOh2JG5WDJW44HNpjupx2tE3XTnjR3JKER7kiCCUUqVKFjpoG2BChk+SwoXduOlbtLcH+kioM79YmqoiO+j4sq24eB2IWOk1N/ylA31OAbXPQa/lfsfS+V3HT/5Zh0fZC7DfYTjNM3JKUpp01biCUglJaVoaszEwxmar3Y9cDioxQ1IQmT3RW+n//+x9+9atficelM9YPPfQQZsyYIc4OU5SlqqpKiIwjZcOGDWKSSGk6paXaDxelptGx0xnx448/Hr/+9a9F1GfKlCkixe2iiy4SaW7EnXfeiWuuuQZvvfWWuI/OvktBxMTfZ+SI3vMNeewY/HxQ2tsTTzwhojD0maD90ckAinZSqhpFdOh9bvV5crvdQUGWiMi6G1WQqLUXajNH9Qx7XZPYkHFBbDXoVFOdGtOMgMSBmmmTkmSHSY/NsN42FAUqrapFm0AfG6u0sPoIHbkuCRjqjyOEjqEXIwmLjlkp4naywy5EUZrLIcZDaWRmKWGVNV60U/6vqCN1ra70xsyUJBFFJKGTF5jL6lzXrFLXlAeh+p7mgGt0moOpjwE2O7DhC+TkL0WPnDTT/joME7fQGS1KjTmSC03GGrKd4WxaXVAEhc7C0WRtz549mDdvnpjcEb///e/FGerHH39cLKeJFtUQUBpZc/D6669j4cKFOOaYY/D+++9jwIABWLRokbiPJpjr1q3D6aefju+//x5DhgwRY2Xi+DPS0Pd8E35GmuvzsXPnThG9HDFiBD7++GMsW7YML7zwgrhP7i81VUvJMSPSfYlCdR0RHdWxSxUtdQqdgCiK1PSxsaD3WrTuW+rE2GgvbdyH2T6pSL/WZD01ekOT9khpfWpNihQdddbo1CP6JMdNEZO2aS7TuSLVZMnXkwQRIdclEWYWjao0CJtKk3VoFfn4dYmzjGQnOmen6EwQ1OdWbe7a0jU6LHSag45DgDG/1m5/8yd0aZMsbnJEh2Gan5SUFJx33nniTDXVwgwcOBBHHXVUsPCZoirnnnuumMB16tRJTMgaA0pDI0MBqtWR0OPRmXIag4TqcKj2YMGCBRg2bJhII5KQ8Lnjjjswe/ZscQwkjBgmHj8fJGwoqvX000+LujV6b+/fr48KkwiiejYzKHWTxI7V/a0dmlTKNHhVuFCKkkR1XquPGYFMvWqOiM4fPlqNsY99V2cjUxqLepxqPcjWQ2UY+fBs/G2WVp915wcrxT4PlVXrBNUFLy3AtOd+Ck7mNx8sw/CHvsGfP1sTXG9fcTWSkyJPjdUmnkZL58ZyXXM5HUHxIumekxo0HQitFxA6gfQ1EjpmAqJCifTRc1FpIkS+32/HyEfnYMG2gjrHnJniDNYG7Q8KnbojOqpBRnPV6LDQaS5O/BOQnAXkrcTECs2l5r2le3DPx6tjLjzMMK0dOkNNZ6xfe+214NlqOXn65JNPxJlqEiWXXnppmAPVkTwmTSJporh+/XpRVE2F31dccYVwsdqxY4cQOBTRIac1EjNbtmwRAonSg6gGglzZ6D6acC5dulRXw8Mw8fT5IKc0j8eDf/7zn8KIgFIyX3rpJd069Hmg9zmZFKxevVqkuJEZR0FBgfgs3X333cK8gEwRyBGOop+vvvoqEgGdcFFuqxNYdUKuc2CrI1Ij72+OnjvkQEvWzs99tzniesZJsWpl/I85W0XE4sW528RzMWN1ntjn5gMhBz86luW7i7EtvwL5ZVpe2p8+WSNEydp9pTrhklKfiI6hSadZw9D6zPGkCHM5bOhpqOEe06NtcIzyNU82RnQqPKYCokqJ6NAxmxkxlnpsIiXwileXRHztO2Wl4NShnUIRHZm6ZhFZtIzomNQSNQUsdJqLjPbAcXeJm6M2/QOpqA6KnZlr8lp4cAyTWJx88snIyckRtTE0WVPtbqkgm1LHKIWH6mXk2ewjhWoOvvnmG2GNS3UFVH9D11RMLe+nidz5558vzm6TI9vNN9+M66+/XrisHT58GFdeeaW4j7alovGHH364UcbGMM39+aB6NdofGXFQ5JIiSFSvo0LvdRL8JKrIdn3ixIn4/PPPhfsacf/99+Ouu+7CAw88IET/xRdfjEOHDiERUCei6kRabQSpT11TIzre6Gp0mtGMYO3+koj3G6MUapoUmTxJ1u0vCY5fnVSXKoXvcl8U0TFCaVh1R3RqIkZ0jJP8ekV0pNBx2jGmpyZsCMo+HdVd82nMM4voBITOgdJq04hdhRLpM+uho0KRQrn/e04bhHeumaB7rhf96RTcekr/oNOfTF3zKCc9rNIeWyKiw2YEzcmEG4BfXkNy8S5c55iBv3vPF4sPlzdP/j/DMBqULmZMk5HOT1T/okJiQ6U+qTrG3gWU7kMF2FR4Ta5rahE6RXWsam5cLpdII2KY1vT5oDRMuqhQhFPlhBNOEBFMq3Hed9994pJoWPXI0ZsRKEJHmXjWFamR9RVW3e2bAjWqYoax7kQ1I1DdxH7eEur9U2UxqSZXMqrXUU0IJFRSQBGLSM+VavJAosOI8XlrSOpakkMvdNKSHKF+OSXVOtMCom3AEMGq0WuV8lxYRVtUDldoUS8XmR0owo/+l3QJRHRIXJE40ttL1526xjU6rZGkFGCKdgb2eudX6IhCnRpmGIZhGIapC6uaG3USq6au1cuMoAUiOsaUMCNqRMZoRuBVbn+1Oq/OSTUJHOoRZHXsavqfUWCRQFIjOvsbOaIjBRwJCumsJl3SQsX/ZEYgU9xkjY4W0dlTVFlns9WKOiI6xJIdhUEhpZozqKKnQ2ZKsGUKpQNG1TCUXdcSgCHnAD0mIs3mxh+SPhCL9hWxKQHDxBuUakPd4c0ustcHwyQq6ueDopfdunUT1/z5aByshIs6iVUn5GoqkZwk02T2lKfn6qIgNJGXwqmp64eNEe8Ve4os1zWmOT377Wac+c+fhRBRBd0mJR1NlyalTKppX8t2WT/WPkUsGIUOCSa1V6nZiWo5yc9M1pKm6PlcuadYPNc/bDwUXUQnEKlRkaliFFEqrdKOWYoQmbq22yKiU6m8L4wObObre4M1QGS3bRbRIZHTMTNgrlVSpYuy0fNy2SuLgimGBeVunPrcT3jhh63BdbiPTmuFEi2piejLJ+MCx094o3Yq9pe0aelRMQxTT8466yxMmBDKXVah5p8Mk8ionw8yLKAePCRyKN2MPx9HjplwMdboqELHTBjNWntAFOd/u/4Aju2fq92nnJVvantpYy3J3ggnfXcUhNwqCTIWIFbvLbaMBKmRFXVSTWJlr0XkgyhQygmMAkt9TmXqGolDu1InJAVWVmqSiFrQ6zNnw0HxXM9Yk4eTBnWIwoxAExQvXnYUbvrfcjx45hBkpThFhIVePxlJCrmuBSI6hebPYaXyXKjvkbowRnTk40l65aaLVLpNB8rCrLvnbz2M7QUVGNAxE4u2H8bGA/qaKHp/0fFSml5TwkKnJeg6BhhxMbD6fdyf9DZuLgpZyzIMEx9kZmaKC8MwkT8fojmqSV0a03DUPiU61zVlQltc4Yno0iZreNQ0I33tT9NGdIz1L5FSvKwiMJReZxQfZkKtzFCjE219iDGiUxh4rI5ZyThU5hZi7XBFDdoHIhvq47ZJTRI9cOi4pBV4XQX4qhkBMX14Z6x6cKrYF0Fih4SYrO021uhYUaFEdKJJXZNQREdXo2MQOkf1aIsF2w6L10c2DP3uzhNwxj/nieeBap5I6KhRNxV6PqRIayr4G6elOOUB+J2pmGDfiDFV8y0LtxgmljGmHjDxCb+OTQM/r/FNLL9+lvbSyiSWognyPr1Lm083abeKDjW1vXS4DbPP8nVYvrtIZ6cc2sarMweIpjkl3TZrqmmGURBJcUjCpn1GsqnzmnxcKU5E3U/gdanrcUNmBKEIkdwPkZmSpHPUM7quWVFVUz8zAsuIjiH6Ig0TlpPQCYi0rFQnJvZpp0vts4q6NYchAQudlqJNN+CYW8TNPznfwf7DWhiWYeIBmXpSWWkd/mfiB/k6ckpR48Cfj9ZBLH8uqqOI6BDFVTUm62u35Vl2VRCoBgRNfQLWaHZgJXSo7oSiGDTJlhbLEhq7MaLTOzc9Yo0OTa6jrQ8xChPqUyOFRefsUANP3ZgCr4EUKPT6SDOAuh43GNFxmPfyyQjU/VDNi66PTh1RkYp6mhFIaByquExWHO6I0T2014NS1OR5gSS7PfjcyB47VlG35uilw6lrLYht0u04PO9V9LQfwo7F/wHOvrelh8QwUUF9XbKzs4M9K6gHjI3qzxoIpbbU1NSgurq61ae2xNKxig7ZlZXidaTXk15Xpnk+H7H0Pmhq4u1Yo/1c0GTzvk/X4JLxPXDiQOu6i8aAaiCe/GYT7pjSH0O7tLHuo2OYxFK0g9yxzFzaZHTCKl2tvhEdMjV4c+FO/OWcYeigOIYdaeqaTFsb3q0N0gMTfUlBWY3OHICY1K+dqOmhnjrXvPkLbjulX1iNjowkpLscwtGMoKJ7Y10SrafFJoAF2wpw14ergkKHRMeqPeERHfkchiI63uB+jU5jC7cdxmvzd+Chs4aia3YqPEEzAvPf08wU7fgpXU7fMDSyGP94+V5sPVSGLtmpGNI5C9FCaWs6oWOI6GSnudCvQwa2Hgq52DkdNnRpo73+n63cj3X7S1EcME9oiYgOC52WJDkDn7T9La4tfApd1zwPTL4WSNcKAhkm1unUqZO4bowGfTSxqKqqQmpq6hEJpnggFo+VJnPy9WSa5/MRi++DpiJej7Wuz8XcTfn4Zt1BMWFvaqFzycuLRLoSpXAtv3+Kpb20euaekO5cZmYEMv1JFTpWaWzRcPmri4Ov9ytXjatzfWMNkJXQkVbQNEE/WKqPnqiuZ067DX3ap6NXoN/M0p1FwXoan5KGqNbodM9JCxbJt0tPFjU1xoiOFDpvL9oVXD6gYwYKA9Edo/NaMKITEB90XFKAGif2tM9v1x/E0X3a4epjeysRHXvEiM7hQERHrpea5BAiKJJwWLW3RFzkc5idlmSZ9ieh/dNnlsQOvR+MNTrEsC5ZOqFD5gLSIY6icVZOcM3VNJSFTguzo+tZWFvwEYbV7gTmPgGc/nRLD4lhooK+/Dp37owOHTrA4zmy8DNt/9NPP+H444+PyTSRxiTWjpXGwJGc5v98xNr7oCmJx2ON5nMhJ+rNUWMrRYm8trKXVnvAiPsCE2ejgCGHLDkprrKK6DTwuLYok95IGKMnVuYHsvdKRooThRX6ifaBUk2YUDTkravHiyjKrHUHdOtUuGuDhfLGGh2d0MlwhQkdY20PccGYbrj+hL54c4HWHJcK7nWiXrquBaIv9BrIqJFxYl8SEKI0Rp3rmomgUGt0ZNqhXI++byitb55iFW7FvsB4O2Qmhwmd9hku5Cuuc3L/kYQORXVUhNAJ9Pyx4vrj+2Bi33YY3rXpXYdZ6LQwXXPS8Vjt5XjP9Rjwy+vAuGuBDoNaelgMEzU0GTjSiTJtX1tbi5SUlLiZCDWURDpWxvrzkUjvg9Z6rDLNqD4NIZveXlo/kQ6aERhqetRUIrU4Xd1XdQOPK5o+LfWJ6EjhQFEL6t2iciAQTWmbnoQ+7TPE7RSleF6ORz0uEjkylY0EkqSdSZ2LEERO/fM0eXAHXdRCjehQLxmpqdoEBAAdV1UgokPHoloqy1Q2+ZzJ58AqoiNT1ySqUQA5oEUjdA6VuYOGCpsP6kVp5zYp5kKHanOqa8PMIIxjooAtvUZdAs+NFScMbI9j+jZPBlPsJ8u2crpkp2CRbwiWphwD+L3A7D+39JAYhmEYhqkD2SCxqd3JzLCqpZETZqkHzMZIt1UXLFU0GU0OGuI8F62rV1iNjqEPS3A9T6iGhuo/TIWOElVIdYULHasaHVXc5KSHLKLVdSUyKpPm0ib2MmohC+6N0THVdU1nBqAzRtDGJVPbagKvV1KUQkeNsEgHNEIKkmyT2h35kkrXOBXVJlvdj2waahbRkel0YtyBGrxOgRodK0i0NhcsdFoYqXqftV0B2JOArd8CW79r6WExDMMwTKuGmk0+8fWGqK2GJWv3lYjtpJOUMRJBqUyPz9wQsSllNHywdA/eWbxbt0ye6Vcdy8zspWU6EUUPSKwYa3rUviZ6M4LonNBUPvxlj65+hcZAj/n891vwu/dW6O7T7duYZmd4rHlb8vHMt5uDLmE0OZYTaUleqYnQMUyiaTzqa1xQ5kZtIOySrQgdo4gg1O3kc5sWEFJy/nawzC2MD+g1l/UvJDQzkh2hiI6F1bVMZaPX46+zNorGmpFS11RRYVxvVMABTRVKbZXnRVo+W4kaKWzIoMG4fxk5Mos0yXQ67XE1IZpSh5Cp6/7GhIVOC0MOGMQvpW2xtfel2sJv/gx4m75Ai2EYpjXxwgsvoFevXiJFasKECViyZEnEupFHHnkEffv2FeuPHDkSs2bNatbxMi3Lo1+tx79/3C661teHf8zZIrabtfaAaSTiurdX4D8/bcfVb/zS4LHRWf8/frwaf/p0DUqVaIQ8w15tUaMjow7ZirVxmHgxNNm0qtGR60aChNQfPlqNP3+2NriMNASlRD01ezM+X7kf93++VncM0YqqK15dIp5rMnyQk2NjREdGJ9TIhXESrUV09P2FZJrVuF7hURAVNcWv0hDRIaFAgoaagZ7+j5/Fa37Px6uDYkuKA81eOrzWR7395ar9+NfcbUofncg1OmaiLku574QB7cX1cKUGRlpBS3rnZojxq+l7lHamRsSSA2m38rkxjegoAtGpjJtMIGIhosM1Oi0MhffojUZflOetm4QfUz5B2/wN8C57A8VDrkA7k9AiwzAMo+f999/HnXfeiZdeekmInOeeew7Tpk3Dpk2bhCGAkT//+c94++238fLLL2PQoEH45ptvcO6552LBggUYPXp0ixwD03zQhJ4cqOrbQJGQEQariM6mQN3DpoNakXtDUCfDtYF0JkJ2qVcFiBQnZDAgxxJ0/PKGCx0R0dGlrnlFBIYK2sN729C+reuqZPG8kUNl1ToxQs+xOhE3HoMYlzJOn9EzOiBgrASAFB/aevaw18vM3YuiI4M6ZeG/vx0v5mIkNoyI1Lhu+vonGdEhUUD7KFX2vXx3cXCsUhSQkFRfA5muRq+XKjJVzESXGLMh6tTRYOP90x9OwoYDpULonDqsE47v3x4Xju2G3Ixk/Lg5X7dur9w0vHX1BGHCcOpz84JCRY3ayGOQ4lGtCTKLhKmNTj+64RgR6brh7eVh2xjTC5sSjui0MPShlW/UUmTgWc954nbFrEdx8uNf6iz7GIZhGHOeeeYZXHvttfjNb36DIUOGCMFD/Wtee+010/Xfeust/OlPf8L06dPRp08f3HjjjeL200+z82UiQL095MRadeSKBln3Is/wN0WNjtrUkSbEEjnRNLOXVh3X9BEdY4oYNdkMRSro8EPubIaITh3HpoowFXX/chxG1KiUcR3ZJ8YYBSALaTPUdCvjJJrqY8pNmmRmBtLAjh/QHgM6ZpqmZVHhPh2i6K0UeG7SAilpYh8G8SYRQiewP2OzTJkOFyllMtoaHarzVunRLg3ThnYSj3/myC5C8B7Xvz0Gd84K25aE56R+uULsBR/XbtNFbVTXNfV/3ZjUGh1l3ORod+qwzqbHYTSMaEpY6MRQ+hrxjvcUuLP7IctXjBvtn2HG6jzMXJOHkjq8zhmGYRIVaka5bNkyTJ48ObiMGlPS/wsXLjTdxu12i5Q1Ferz8vPPPzf5eJmWZ3mgCaVRSESDXN/dhK5rakRHFRtywml0USMqAwXvJAZkY02KuJhFTmSzUEl1wMLZKGzqss62EomHDP1uzKyj5bjkBNytvA7GJpxSwDgMqWuSNGWybUyLIktumeKmRhyMIkVGy1To8EprNMMGuY90JXpkVtcjxypFgbG3jfw/Us8bdZxWooKQzm/RkGHY1vg/QamBqpiRLncRhY7yPBpTC61IcTWf/ODUtRhAtUushROf5N6AS4p/j984vsbtG87Bs9+l4reTeuOBM4e06DgZhmFikYKCAni9XnTs2FG3nP7fuHGj6TaU1kZRIOrtQnU6c+bMwSeffCL2YyWM6CIpLS0N1vo0pI+U3OZIe1DFA7F4rEt3aEXfhNtTW6+xGYUNTeKt3geR9vvl6jzsLKgUtRPH9tMXihdXhIRCQaBXDOFy2MQ+pV2xHA8tK62sDk6y5Zy9qsaD8qrQ+1aKl4JyvRApq6rGyt2HMdvYg6a6xvQYqtxuLDpkQ84BLf3PyNZDZWH7KSyrxIw1BzF1SAcs3lGIJYHXgPrN0KTfXRN6HfYcDs9mcdr8sMNcWFGQRW7rgM9SPFBxvrRXTk926I7NOEenPjO0bnENgs+tGAe051vswyIFK9lpsxxHcaUb87ccxLJdWpqbGXblMVRSnfrjyXJp74doSEvSHyBpNOO2Nvh1kS15vxRe9BoYt0lxhF4Tpy18PDTFNephm48+M0d2giDa42ahEwMYnUfuX98FXR3DcbxjDSYVfIivcSX2FR+ZewvDMAwT4u9//7tIdaP6HKpNILFDaW9WqW5PPPEEHn744bDls2fPFilyDeXbb79FohArx0pn5hduoQmqNnlbu34DZpasj3r7wuLQtjKVbcaMmaK43cjMmTNN93GgEnhilTM4eXxinBfqnHnlYdqZtuCbH+cHb5eVlYl97tlPk1F7UESIZUIbOGH3eXBg/z5x/7r1G+HP26Cb7h3IP4yyIpp5hia0M2Z/HxyPytx5P2NXZvj4v99vw+e7HHh32wrT4/tl027d/uf+9DO2lNrw1W4HPp6/FisPK2f0a0jI2VBYoh0b8WNe6PiD+1y8ADsKw5cTm9evwcxDmhFApdCA4cfisvlgryXBor1QVaWFutdn80H9vtOhrVvstmH29z+Kfbrsfsya9XVwnarS0OugUl1WivnztG2MLF25Fk/st8PttY5+LFm0APvXhC8vFBpN22eW06cbS11sE+dmQuOZ/8N3CAVotOW+w7tRUUYLtbHJ56esQDvOPds2YWaF/uRRlfJ8l1VUhL3nR7S1Y2Wh/jn6+uvox21FZWV082IWOjEARWouf2UJuuekCqcSOln0BqYJoXMKluB+XI5S7Z3EMAzDGMjNzRVNKQ8e1Ltn0f+dOnUy3aZ9+/b47LPPUF1djcOHD6NLly645557RL2OGffee68wO1AjOt27d8fUqVORlRXKca/P2Uia+E+ZMqVVNdGMh2PdW1SF0kVa8TXRt98ATD+pb9Tb/2PrfKCyQrds8tRp4iy8UcxR3ZcZP1Fjx1VakXat34bjTp6s6+lSuXwfsHmduN1vyEhgg+ZqlpKegenTJ+GDQ8uAIi0i4oMd06dPw89bDwNrlqFT20z07dUWCw/tQa++/TGufy6wOuRAmJHVRjtrXxSKKAw+agKwalnYOI8aNyHMlph4//WlVH1i+RyV+imlKhRJGjvhaBxYfQDYvRf7a/T3demQg307i+BKScX06ceLZatnbQJ26m2pp5x0ArzrDmLW3q1hj3fM+DE4ZVCHYITr3qXhbTo6tEnH0C5Z+GqNFrXq060Lpk8fEby/esU+vL99XTD9b2ivTtix5gCKaoBzxk8EVixFRqoL06efFNxmdvlqrC/WR8GIgT07YdrkQXh4OYkdPa523eDek4dInHTC8ejfQWuAqkJGBg8v/0Hc7t4hG9OnT0C0bDpQhn+sWxhMQTvrjNB7s8PgArz73VL86ZJTcO3/VmFHWZHu/Tu0sBJfrT6AKyZ0R1ag/ktCrnP3LNXe9w5XCqZPP0F3/zEnevD24t04e1RnLNhWKNzYTgy4wh0JMqpeFyx0YoAxPXOw4dFT8dPmfFz5mvZlNN83DGX+VHS2FWKUbRvK3HpbQIZhGEbD5XJhzJgxIv3snHPOEct8Pp/4/5Zbbom4LdXpdO3aVUzGP/74Y1x00UWm6yUnJ4uLEZq4H8nk/Ui3jydi5VhX7z+k+99vs9drXDSxM+KzO4JWvCpW+y1z69N2SKyo61Z6Qo9RoqxL0SNaT7W0pp4wDocTpYEaHWp8mZykTe+8fpsQUiq0j4oafdpPUZV5yiZta3YMdZUlyfQwiddvR2m11/Q+2ViTmmXKxzpYFm5GkJEaOi4jWanJwW2dTvP0tpyMZIzv0y4odLLSXLpjS0t26Yrqu+ZokVqK6NQEnkOqfVK3aaP0qVHp2jYN6Snmrrlb8+uORNBYzJ73Ng61Pqh+n6fsjBRdrY+67djeuTjU1Y+UZBdSlBokuU6/jm1w+5SQVbWKOgKq8TKOqX2bJNwxdZC43aeD+T4aQrTHzmYEMQT5nZMtIp1pcaWk4QffKLH8VMcSEdEhQ4L62mAyDMMkAhRtIavoN998Exs2bBAuahUVFSIdjbjyyitFVEayePFiUZOzfft2zJs3D6eeeqoQR3/84x9b8CiY5mCZYkTQEDMC6bqmYmZIYGEQZurEZTQBUO2QCyvcYXbOZpbRxQHTorbpSUH3K9M+OrWhdeUYD5XqxUdwXYs6CitbaStoHMZjlkjbaXWceWTrbOa6ZmUvrRTWUyqqGW3TknBUj1DfHNnQU6IW2lNNimwIShEd6bCXrogAM3MA1STAzNwgWttxq4ahak230a67LjKV9a1MFMRjWzzH0RCLc1SO6MQQbdNdmH37CULskNPa1zPG4yzHQpxqX4qnSy/HpL9+L858zL/n5JYeKsMwTExx8cUXIz8/Hw888AAOHDiAUaNGiQag0qBg9+7dwolNQilr1EuHhE5GBqUDTReW09nZHD1PFKFDjRL3FVeJiIhZitD6/aUY1ysHdoNiMZvkC6GTbDedlG7PLxcl9H3bh1KR1D42Zu5mstcKUVjhCRNURgEyd9MhHAg4nWWnuYITZeG6FnA8o2W0PT2WdF3rkJkitssvtxA6RgHmrsW6fSVRW2rTpJlEGF3I/cwMmQqlisW84iqLPjoWrmtR9GWh52VQp0xLMWW0Ve7cJiUY0ZETeKN1tZVgIDddK8EQjUuflb10Xa5p0a6fEUnoWIisaGgKq/UjhYVOjEEe6ERGShLm+kai2p+EnvZD6OfZgfW1vcSXzOFyNzcSZRiGMUBpalapanPnztX9f8IJJ2D9+ugL0JnWAU36N+Rpuf3je+fg0xX7TIXL5a8uwao9xfjr+cNx8bgeuvvMhJHZBM9ODThrvTj5aa1OY+OjpwYbLxr7zJgJCjNRFOx3Y7BrVpsy5pDQCQgCOjayRpbuZgXlNThcXhN0weqcHRA6hnQyKwH269eW4BdDRCwSHbKSRU2UZmlt7pIlxYI8NmoWetBkPGRxrEY06it0ctJduogQ/a/bv3IfCQ3Z+uOwm3rxaK9HuiGiYyU2qL8NCWSq9ZHvFzP3sSMRG/07htfwRMJBtuMuBypqvMhMto4G9clNR2uCU9diFPrwVCEFP/pGBtPXJNxElGEYhmHqD/WLkZPNToEz9mZNL0nkEO8s2RN2n8dE1JidpaeJZZESjSmt8linroVFdJTUNWXdYOpaBGve7LSk4ESZxiXTrkK1ML7gPEOmM1kJHaMAq4/IIToFGqKT4FOPQ0WmYFHtE6URVnm8YXVQlOlCwiFJicqqpBsEiNXzQnx0w0ScN7orbjm5n+5+NdWM+sH065AhIkgVtTZsDsy7jILKqmGo7G+jCpZhXaOvT4mUPvbS5UfhV+O644qJPVFfMgKiMlJE58YT++Gisd3w+q/HoTXAQidGkWc4vvaOF9eUvibZwkKHYRiGYeqNx+cLayxZqywzovarMduHUejIppKEw2ZDcVVocl+mRmnqqNEp1aWu1YSnrpk04JRQr5hgjY6XhE5tcLlx4p8amNwbhU6wMWmExzHDmFrWLkN7zJIqj2XKVpbSHIbGW2HynMtImFVDSmNKmRny+Mf2ysEzF48SaXsqLsVMgp4/eswhnTVHxfnbDpsKHSvBIB305PNIjOjWJmJtTLQRnVOHdcb/nT8Cyc66j9mIFGaRxkHP5d8uGImTAi528Q4LnRhFvgm/941Gjd+BAfZ96GsjX3yO6DAMwzBMQ5AREUopkpNms4iOREZDVMzWrwk0mlUDLQ6HTSdSVIMBNdJjliJmlbpGgQ6Kdsh0NDMoJcssokM1Ksb1pNgz1ujICXGkyJEZ/TpkmgqUAyXmESP1sYLjDbjHqchxmpkRUEqYKiisMAo9I7oancDjHNVDq9lbt78szPQgkmCQdV3qPjOS9WYIkbBK0TtSMgLjtzJRaI00SOi88MIL6NWrl7DlnDBhApYsCaVVmVFcXIybb74ZnTt3FvacAwYMsGyixejfjKVIF1bTalSHhQ7DMAzDhPD7/Thg4tRF9R6HAkX6qkihM/YyDcqs5sbKRYoex7RGJyAIdEKHIjpKXYqajibNAGSEgNK11HFapa6FnNS8QcFmhCI1MqJDwi4kdPRpViR8pBAxGgV4ffpaIBJeFJWpC0oxkylyqmA4qBybEXoO5GFQPY8q8oxCJ8nkeEn8WDmtGV3XIqF3XdNuj+6uTzdLC4xDEqnWxbhPOk6K6rQkmQFhZpVy1xqpt9B5//33hY3ngw8+iOXLl2PkyJGYNm0aDh3S+9JLampqRJOwnTt34qOPPsKmTZuEBSj1LWCsUcOhs3zjdXU6LHQYhmEYJsQ7S3bj6Cfm4IOl+pqaW99bgfGPz8GCrQX6iI4jFNGJZJVsjOiYWUsTbm+40PH6/boUtXK3WqPj0dUJPfTFOjHOxdsPh0V/1HQ4bUy1wTojM9FFkQsZ4VBT14zF9zTxl0LHiCMgAilyRM/PhL98h1MCpgqRoMclpzrjRD+S0KExyPXO+OfPuPa/v4TvN0JEhwRltM62dY3dmIInIzqSaCM6oX06dEKnf0d9xKu5yQoInEg1Og2BGt63GqHzzDPP4NprrxW9CYYMGYKXXnoJaWlpeO2110zXp+WFhYWiA/WkSZNEJIjcbkggMdaoZwm+9Y4RTb+G23eim02zkFTzdxmGYRgmkdl8QEst2mzoUTJjtdaB/pWfd+iECp2xl5PmSKlrFGlRsarnkfUnNT5D7xglUlIaEC+Upib3Ky2MpfDZGDgO1V7aSF2RFZrQByM6tX5UBFLBSAC1zww5ttL/xtqWDpnJOKZvO5x3VNfgMWzMKxNOXQUWFtTGif1fzh2G0T2y8fSFI4MCRlpfm29j1wkCafusRqBkLZFZBMsszevfV4wRY5gypKPueKONvsj3RsesFOQkh94f5FqmogqGUwZ1wMju2fjfNROCyy6b0EPYmFOtzymDO+LUoZ1w8qAOuPHEvnjgjCGY0DsHE/u0E+v2yEnD5MEdcMtJepOExuT8MV0xqrv+eWkMXrlynNjvW1drJ+ZjiXpJOorOLFu2TNd0jfoSTJ48GQsXLjTd5osvvsDEiRNF6trnn3+O9u3b49JLL8Xdd98Nh0kXYcLtdouLpLRUs4KkztV0qS9ym4Zs21I44BcfXsrFLUQWFvsG4xjHepG+9or3dOQVViC1fXrcH2dDSJTjTKRjTZTjjMdjjZdxMomNrFkx2i4b08F1NTqBCXIkMwIjVhEdM6FDj6XaSMsojYzy0OPnpOtbRZDAod99EhZWFAeEjmpdrEI20jJljCJNVZ6ANXKyA2N6tMWsdQcsJ/53TR0g7LRf+GFr8LiW747eaY1S10gcfHrTJJ15UqSIDokcs+L73IzkYOqfFGRmZgRm5SzThnYSF4qUSYype9HU6BC9MvwodNssXNdC0+gJfXJw3fF9dff/ZlJvcVF5TXEz++2xvXHbuyuC43vlqqZ1Ojt5UEdxaWwGdsrEZzdrr3lcC52CggJ4vd5gAzYJ/b9x40bTbagZ2/fff4/LLrtM1OVs3boVN910k/jxpPQ3M5544gk8/PDDYctnz54tokcN5dtvv0U8kWxzoBLah2uWb5wmdBya0Pn2hx/RPaN1HGdDSZTjTKRjTZTjjKdjraysbOkhMEydyJoVq+L59IDQkcJARHQCM2Qr8aLW5cgaEKs0N+mapj487VetfZF1N9KIQNTIGCb45MxmVqOiUhKY/NOkW0aJVGisSbJhaK0vGNFJczkxpmdI6OSkJ4VFrGTthpzoU+qbbLAaDUYnsFDjUuvnmGydzeyUczNc2BqoikgJ7NdpYi8dqXBfdY2rqwmnOgbVPa53ph/LtYxC8RyGibRAU1QyG2gIJEAb0gCUiY4mf1Z9Ph86dOiA//znPyKCM2bMGOzbtw9PPvmkpdChiBHVAakRne7du2Pq1KnIytKs/uoDiSqaVFCtUFJS/BRgPbnhJ1QWa2dBvvGOwyNJb2KsfTM6oAijx0/BeCUPNp6Ps74kynEm0rEmynHG47HKiDrDxDJSaKg2zWREIMkITCapT4ucyMqJr7FnCwkbFRIDcoJbW2dERz/pPlRWHVajc6C0Kig0jDUyJIbqEjrSsprGZCZ01Em7ZkZQGxRGvXNDrl/Chc1gdCAn21KgkFBYtacE0WJ0PzP+L0WBvCboOTBzTctOpRQ8mxBJKYFIitG+Wq0nMqM+rnH6Gh27TuhEakxKUZ3DFTVRW0cbSU2SBgGtXOj4/UB1MVCeD1QcAsoPASlZQL/JTfqw9XpWc3NzhVg5ePCgbjn936lTJ9NtyGmNfszVNLXBgwfjwIEDIhXO5QoPnZIzG12M0H6OZGJwpNs3NxnizIr2JXkQOVjm648x9i2Y5liKGt9Uy2OJt+NsKIlynIl0rIlynPF0rPEwRoaRAke1aVZrWWVER06uqQbDyoxAriOh9DMpdKwiOjWByIEhQIJDpW6diPl2/cFgsT0JDeMEn9LbItXnEDKdKy0g3sxwOW2KGYGM6DgwrGvoZDEJPFnkL5GTbTkuckHbV6wJs2gwCjdjpKZnuzSRziavpbA0S12j8ZLbmsdbG9Feuo5ATdRQJEwKMBkRI7qkazVCVR5fmBmBrNMhodPQAv9QRCcOv2t9PqCqKCRcKvID14f0goaW08VraBrb+/jYEjokSigiM2fOHJxzzjnBiA39f8stt5huQwYE77zzjliP6nmIzZs3CwFkJnKYEEZ1P8s7Tgid0+xLUBwhf5dhGIZhEgkpcNSIjtEyWY3IaDU65vbSxh41ZChABeVm6xrFkVqjY6xNobS0+QH3N4IKz43GAiRyNh+M7Kwq637SXU48eOYQ/GPOFjx6zjA88Pk6XHd8H3FfyIzAh0pbKHWNUq0uGd8dczfl48SB7bF2X6npvEMKj92F9UtdDYvoBEwEJFQET6/LOaO7YuG2w+I56dIm1TSiQ0KOBCpFraj2x8qMwCydTfK7yf3x05Z8XDWxV1Tjp+MWQkd5HNLDF4zphtnrD2Jol/CsoimDO+Kr1XkY0bVN5GiG1wPYnVTcrrtrYt92eGvRLpwwsD2aVaB43UCtWxMf1RVIr84DDq0nCawtk/dVFloLmcoCwBc5AhlGchaQ3h7I6AB0GoGmpt7yk1LKrrrqKowdOxbjx4/Hc889h4qKCuHCRlx55ZXCOprqbIgbb7wRzz//PH73u9/h1ltvxZYtW/D444/jtttua/yjaWUY8zW/9o3HfXgHE+wb8FVZPsXLWmxsDMMwDBN7qWuhk4CqEYAUONJ4gCa0Mg1KprOF9qU/kahaRFtHdMJrdAg1tYwiOrLW5K4pA0ThOokUFUpbW15HTUxJYDxUoE+F7r8+ppeIRpw+vHOwlijYMNTrEzbXatrVE+eNCNYdjezeBrSJzNYL1ugEtlf7+USDUdgYIzrUR+YP0waKx77pxL6hSIqJ0El3OYNjDkV0TMwIIkR0erZLx9L7JkfVZ0eMl8bhDq/neeD0QXjk7GGm+/nzGUNw3+mDYSMhc3gbULQDKNwBFO0MXAdue6RotAGOpIDoceIYuwMrUp2wfecEvteW6S8O7Tq4TeB/9eL3ArU1AfFivK4OX2YQJ/Sqi7jKBjSMlGxNuKR3ADLaG64Ny5M0p8Hmot5C5+KLL0Z+fj4eeOABkX42atQozJo1K2hQsHv37mDkhqDamm+++QZ33HEHRowYIUQQiR5yXWOiSV0LsdffAbuT+6GHeyva7/uOvjJabGwMwzAMEytIcaJGY2RTTlWgyKJ4igzIInZjobyxrkMVTHWZERgjOirl1Z6gTbLs6SIjFRISFrL4v3duOnYUVATvo3Xp+KTrmrQ6lpNvdRIuJ+okwKSIkel76rokbHrmpGHn4UrdCVZpKmCsX2qoGYGEHs9svGZCh4ScTBkMCh0zM4I6REy0Ikcbv7Z/NXVNt5/qUkXIhMSMjW6X7AX80dQEUXSHBEfo/Rn9CJsGvyMZtX47nCnpsDmTAYcLkNep2YpgaR8uXGiZM3YztBqUUEhpalapanPnzg1bRvbSixYtashDJTQU4l22s1CcLbj3kzW4cEw3rN11Anrkb0XXPBI6IcMGhmEYhklUpMCxSl2TqWWhhqEU0ZGpa3VEdJT91GVGEKn2XUR0AhP2UC2MXhgcKnMH09mO7pOjEzokEqo97lCNjsEBTEV1TZNjMyukJ6iJpRQ6ch0z4RENRuFm3I+Vs5iZgElXIjqylsjcjKDxZAKVy5DhU7+qYmDFatgLtmHMzvlwvP53oHgnUBmwX7PCmQrk9Aba9gLa9g7cDlyn5WgpYxRNiXjxhm5TlEj933i/zwN4a7WwliM5JE5018maEJHXzhT9MkcSamtrhTPy9OnTW11dZiu3eIhvzhrZRVwI8oOnD/M/3jsZyH8V3YoWA9UlQEqEnFCGYRiGidOamytfXYLjB+TilpP7W6737LebsXjH4WABvypSpCBQBY4UKiQEgn10vJFrdKjZ5UX/XohJfXMxqZ/W3DEae2kjlJYm+8EYi/6N4owaifbI0ffKy0x2Il8RQlbCRRxfYL/qsVitP6BjhjBJIIKpbw2s8DcKN+P/Vs5iRptrMd5khz51rewgslf8F68kzYATPtgDl4xKO/B6lhZNIRFA1+ISuE3iwrjMYvk3lSVITqkBNlNBOfU0BLrRANRswrRcvYBpGxA2dDujIz2JDXrumKaBhU6cIM9YVGT1xRZfV/S37wM2fwOMuKilh8YwDMMwjcq6/SVYsrMQeaVVEYXO3w01Lmrama62ptZviOjYgg5eRoMBNSpE/LylAGv2lWDX4QqM761v6xBmRuC1RRXRkQ5bxpoWydAubcKiF1IkyJQ8NRXNiJlQsYoAXX50T7w8bwfG9gxZTzc0ohNmJ22M6FgIHWmBrR+vAyO6pMO5dRbO2fgaMOcHtPF7Mdmo10gj7UKjQH6/lMJVltIZbbsOgLdND2w8WI2BE0+Ds30/TdAkZzbOgzHNAgudOIO+qKh5qBA66z9nocMwDMO0OmTdjFWqmBV6MwJF6ATS06SooVSpaM0I8ko0e2WyaTamuRkFllmNTqesFBEVooiOFAJStEhzAiPd2qaa1rcQskZHRofMMNaY0ONapXh1bpMqCvZlHYxcvyHUZS+dZag9llQGmppKetvyMHLjDzhn3xewJR0E9mrLPV3G4S+7BqPEn447pw1C2/QUZKS4AJtdu1Chvrxto9s2i+Vyfbtu+Y0frMe3+5Jw07GDceeUAfB5PNg6cyYGDJpOXvsNek6YloWFTpxBZzg+847Hrc7PgK1zgJoKwKUPbzMMwzBMPCOL4K3snK3QRXQq1NQ1fUSHRI6sC/EYIzqG/LOC8pqg0LF0XZM1QCZ3d87WhA5B/VZ0Rf8WER1KXVOdv2i8sv5FpuRJMwIzjAIjUvSHaJOqn8QnN0FEh1IFrfZbUVOLVFTjdMdiXOSYi/H2TcAmJVVs5K+A0VegKqsv3nhotlh8bf/j0N3E7vlIKEouQS0K4TKpBWLiExY6cQblrK7z90S+szPa1+YBW78Dhpzd0sNiGIZhmEYjVFMTfWd7Y9qZPnVN77pGIiLaiI4qvioMkQdjw1CziE679GTxWKq7m4xsGGtYJJ2zU+FW6lZoPaPlcSQzAmPamxqtiYYGp64ZhJsqbCiKFeaARpZwe3/BH9wv4NTkBciwaYLQ67ehrPtJyJ70W6D/tKCrl1NJcWtMEwKJK/B6GJ9rJn7hVzLO0ArzbFiSMklbsP6Llh4SwzAMw8REREf0jQlsY9b/plap0ZETZbKPvvXdFcFmnsYaHRVjg8/g40YwI8hKcQbTzoy1KlYRji5tUnRig6I5RvERyYxA9KZRJuvpZCdWDxrsuhZmRmA3r8+pKAAWPA+8eDTw6mRcYPteiJydvo74m+ciHOP+Jw6c8SYw+EyddbHqztYUWkQ+Zyx0Wg8c0YkzUpO0l2xe0kScjo80QwLqXksWggzDMAyTIDU61PTSSnRQ/Yra7FKmlknhlCRqdEKT2S9X7ReXnf93unB8ky5nZW59kXxpwN3NiBRHVSb9NWmCT6lh0lGNBIoUWcaaFjWiQ1bTESM6daSjUVSnxlt39McMY6SJhhuN5uySnWopmNq47MDm2cCKt4BNX2vWyIQzFeuyT8Qj+8ZisX9QsKtMWmC+YzwmScesxm882T0n1fQ4mPiFhU6cIc/KrPL1AzI7A2V5wPa5wIBpLT00hmEYhmkUZFQmUsNKq2gPpZ6R0FHvlxEdGXnRXNdsEUVLuwxXmNCpK6JTVKPtU01Vo5QtMiSQPXFUi2WriE7HTEp3s+vWC4vo1JGOJgwJAkonUvTHDONjZae5gkLtpIHtcePxvXH3e4uxo0w73j9MG4iTBnZAr9z0sP10tx3ERY4fcWnpz8A7WtRM0GW0qLvB8AswMCkTf9xbjDV7S/DQl+u1MZtEoShSNf+ek0UqojFK1hjcfeog0dZjZLfsRt830zKw0Ikz5JdVhccPDDsTWPIfLX2NhQ7DMAzTSpDuZtItzXQdi2iP7B2j1t7IdeV+SUSYNalUzQhyM5KDjTQlpVZCx+sTEaaSQBCmR04atuVXBK2kyZDArGmmVY2O1tA0JMSoYabRYMBMCKio69c3omN8rGw1IpXsxOge2Ui203OqjbF9RjKGqMYAnioxN8n95U3MS56vLaOnNbUtMIKMBS4HOg0LHS+AMT1zsK9Yq9Eh0i3G3LUJoy0UYRvdI2SzzcQ/LHTiDPllJTznBweEzqYZgPe5lh4awzAMwzQKUphQdprP54fdpPDcSgRJMwGziI7cL4kIY8G+RKaukdAxEimiU1jpgcdvCxM6FMHp0iY0OVcjEdJJzQxjRMc43vQ6xIu6fX0jOsbHapMWGnOW3Q0Ubsdw/yb0tpeiva0YIzbPBfZXAeWHgIpDQMFWoKYMtJXPb8PPvmHY1OVcXHvtLRFT7SldkCDPgkjPDcNECwudOEN+WZHNJXocA6S1AyoPA7vmA90DBgUMwzAME8eo/WpI0CRTH5QoIzoy9Uy9vyZwW9bqUMRENgxV+XjZXry3dE8wdS1aoUOPeaBEi0bkZrh0ds6a21gooqNPXTMTIH5g92L0W/pfLE7+Ck544SnMgL0iA5NdDlT4U1COVPRaOANY3xZIzgKSM7RGlq6M4P+DbLvF3mjdTFcdBTZU6ytFSvkh2MoP4o6kn9HWXyyETL+SCrhcBWhvK0HaRjewEXiStpNPkb5vq0abHqgdeRmOn90Z+5GLs9t2qbOeWD43lJYX5tDGMA2AhU6cRnSqPF74bA7YB50OLP+vlr7GQodhGIZpBajRGKs6HaueNjL1zBsxokOpa+ET6bs+XKVLMaOogkyFMxM6VINC0ZwKdy3yAkKHeuCoqV80eVcbZeqEjhK1oCaZ5zjm45KUhcBreehIC+UQvWVAJdBB1WbrFyISr9Ifqa/WANiQooihTCApDagqAsoPAtXFYdv/TtVglJKnPLY/KQ0HajOw15uNfH82hg7oh549egMZHYCMjloNcacRcNhs2D97pvZcReFkJg0GOjSB0QCTmLDQidOIDoXzq2u9SBt8liZ0Nn4FTH2ipYfHMAzDMEeMGo1R+89EI3Tot1Hcr0aFgq5rgRodOzUMjRwxoLoYSjOr9rgthU63tqnYnl+BgnI39hRViWVkPKAW81ONTlaq07RGx1VdiCsd3+A8x88YZd8WOHgaYDqKep2K29b1xwF/Dk7pnYKhuXbM/GULMmxVyEAV/nhiV6T6KwF3mXapKQ/ddpehuLgQKb5KpNgCY66t1i4V+eYHbE8KCBVNrHy6xYM9nkwhZIYN6I8PN7qRj2ycfexo3Dp1OG77xywszdeO85UxY9FziJBmOmz1tKzunpOGl68c26R1OExiwUInzlCbflH6WlrvE4DkNuKMjG3v0hYdG8MwDMM0V0THMnXN4xN1Par7tFxXiiZKW6ur4STVxVDNSL5i81xSqRc6FL3ZU1gp9rt6b0lwmV+Z4lMEp7NSo5NqqwHWfASs/gD2rd/hkSRNmPnggL3fycDIXwEDT0N+kQ/z1vwk7huU2QW57dvga19OcD/3nHQqHYjl+H/13E/YeKAMTtRi3u3j0DnZoxdENRWaOQBFYEjc0G0lXezJJ+Zgf5UWpbq9a3/8skHLT7NTmhw9h8rTZ+Vg15DePFNMBBPDNBQWOnEGFWSS2KHUtUrq0JyRBgw8FVj9Pmwbv8ShqmPwyYp9uHBsT9PiTYZhGIaJdfSOab4663iMZgRGowJZmyMjO1RsTzUgqg20qdBRm1yKPjp6u2lKx+okxE4VVuwpDgqdggqPLoKT5bLhGPtanGv/GWeu+wVYE3JzW+Xrg8+8k9D7xCtx5ZTxweVOe7luLKpQoGhUXalgJHKIWjjRuVOXiOuaHr9yYpVc10Jj0Zar2iaatDQrhzmGaUrY0iKO09fu/XS1ZvdI7mv0Ym6agQ+323D3J+uwZGdhC4+SYRiGYY48omPVL6em1tpe2hgFMqvRIawspuVEn5p9RoL2I6M10hqZhI7UAGQI0GHRX2B7bjjecT2OC50/iXQyKtTHcb8Hbl6Ks2sew+ve01CTkhu2bwnVCqn/U5+gpi7WV8UL9dEx9v5RhY6ZsUNDIzoM05hwRCcOkd9t87cexsvztuPuk08RhYG2kj3ogp3YjL44WBryomcYhmGYeMIbTepapIiOIUpDDSbFddB1zRa6NjdSQ4pIXUuqsylnlzb6wvkeScVI2f8Oznd9hcH23cASbXmJPw0zvEfDP+JiXHbBRZSiEdhCSwnr2S682aYaDVGjS20V4WFF+8xkkXZ33uiuaAjq46v20tRrhlC1TTSpa/07aClvDNOcsNCJQwrKtaZdxLwt+bh9cn8s8o/CCViA4/1LMRd9sbeoCk/M3IALx3ZDvw6ZLTpehmEYhqkParqalemAVcoZWT2HR3Rkw9BARCcgMtQoSUMiOjJ1LQOVONWxVKSmjf54PWxkEW0HavwOuAafJupu9mccjQMbCnH9CX0VkQO8ffUErN5XjMmDO+j2rY6NRMcpgzriphP7CuOD00fUnYr239+Ox5er9uOWk/vVuW6dQkeXuhaIhinaRj6fZrxz7QSs2F2M04d3btA4GOZIYKETh9DZGarDIbYeKsfCbYfxceVROMG1ACdhKR7BxXjym03i/ncW78aah6e18IgZhmEYpnnspanhp7Guh2p2/H5/WEQnkiGBWY2OkXa+Alyw+3XcljxbMxkIsC11OF4pHY+Z3glY9auLxbLBdOnePmwfx/bPFZdITTvJppnS1f546iBEy+DOWeLSUKSgkXVGsp5JWmI7bKHXJUlVPQaO6ZsrLgzTEnDCZBzytwtGYMl9p4gzLJSLvHRnIX7wjYLb7xQ+/ANse4Prlrn1hZMMwzAME09CxypyE6lhqLGuhxzYSDCFzAgCEZ26hI5iBa1igw+XOubg91uuRN/9XwmRs83XGR+mXAjPzcvwZJe/413vKShBw9O11IhOS3gL6VPn7EgJmAnIa13qWoSIDsO0JPzOjEOo6K9DZgrG9mwr/v9pcwHKkYZ5vuHi/1PtbDPNMAzDxB8kRJbvLoLbo1kuR4zoWNXomJgREGTSU1pVq4uWRCqip8gQ9dEx0se2H++5HsPjSa8ixVeByg6jca77YZxS8xTWtD8LyO4p6oSOFFXoNLXxQF1mBFSXkxIwQgpFdMyjTwwTS7DQiWOOCgidNfs07/5ZPs2W8jRHoPKRYRiGYeKIB79Yh/NeXIA3F+6qU9BYR3TIjMAX1nvu0pcXY31eqS4CEamI3mG3B2tTKMWN+tHc5PgMX7vuxQT7RlT4k/FtzztQc+XXWOHvL+I8vTK0MVHdzpGiptXV1fOnKVDtpSmiIxudSudXfR8dnk4ysQnX6MQxPXLSdP9/5z0KtU67cHnpaTuAXf5OLTY2hmEYhqkvVFdqpP41OqGIDtkyU985M7c0cW2ScnX50T3gqfXjpIHtUVLlwRkjOuPolF04auWDGGLXBNjWrAl4M+d2XHHaccjOSMVtJ/eD1+dDO/dmcf8fpg1CuduLi8Z2Q2PQEkJHjeiQ69ttp/TDgq2HMaJbNuDz6lLXOKLDxCosdOKYLtmhTstEMTKx0DcExznWivS1f3u1/joMwzAME69Yu67VbS9NkQazpqCyNsdHxTsGrj++L7oHTiS2c9Xi+XYfw7/oRdjsPhT6M/CI50occ+yNeHR8j+A2d04dCI/Hg5kzNaGTk+7CPy8ZjcbCFgM1OueO7iYuhIeETpSuawzTkvA7M47pahA6BKevMQzDMK0Jyz46UdhLk6Axs5CWqVZmzUizZc+YbT8AL04EFj4Pm9+Hz7zHYIr7SXzmOxbOZm5+aW8BpSNd1yiyYzeJKOlT1ziiw8QmLHTiGGoG5jR8+cz2joXPb8Mo+zZ0xuEWGxvDMAzD1AWlhhmtoCMJmqKKmjobhpKJgKzrcTishI7221kTaCSqkuErAz67GXjrHKB4F5DVDUVnv43bPbfgMNoEtm/e6RPZS7eU0FFtplX0ZgQ8nWRiE35nxjGUs2sseMxHNn7xDxC3T+WoDsMwDBOj7C+uwsiHZ+P8lxZGXE9GXV79eQdGP/ot3l6k1cnUWER01BodMh0wqx+R9Sf6aJEf0+2LYHthArDybWEugPHXATcvgmPwqbrtI9lSNwXUQ6elUteky5oRfY0OTyeZ2ITfma2sToeY5dXS16hLMxcIMgzDMLHI12sPiOtVe4ojricjPo9+tV5c//mztbrlxPCubfD7qQPCXNco6yFSREdGhTqiEB+2eR4vuv4BVBwCcgcCv/0GmP4kkJwp+ukEU9qaMaJz15QBGNerLS4Y0zimBvVBikEyIjBDTi8o2NQSZgkMEw0sdOKctsoXr+Qb71hxPc62CV2cZS0wKoZhGIaJjCvKE3FmdTRieSCic97orvjy1mPRt31GMHVNRmocVkInUDxfW+vFZY7v8G3yHzDOvRCwJwEn3A3cMA/oMUHXx2ZMD62lA9FcJxFvPaU/PrzhGNHHJtYiOrJGh40ImFiG351xjtmX3z60xypfH9htfky2/9Ii42IYhmGYaF29ImFVi1MjozYB0SF/D8lOWoogEjlmokQsK9iCl/0P4S9JryHLVgV0HQtc/xNw0p8AZ7Jl7zq539ZOqEbHIqJjl88xR3OY2KX1f1JbOVZFgjJ97WTf4mYeEcMwDMPUjSoWzEwBJCRa/CY20FLMyDQyKXSoRqc2QkSHGn+2XfZP4F+TMM62QTT+fMhzJXD1bKDjEMtxjFGEjtEIqDXiCgicuswIuFkoE8vwuzPOOXFgB9Pls3zjxPV4rAWqipp5VAzDMAwTGVWAVNbUWq73h49W44Qn5yrb6etrpDGALNivqqGITuA+g+vacNt2fOn6M7IWPAF43fjJNwLTav6GN7ynAvbI6WEjqVFmgHK39XhbW8SNmq5GTF3jiA4Tw7DQiXNOG9YJL1x6FC6bEGpcRuzwd8ZGX3ck2bzwb5zZYuNjGIZhGDPUGE1FjTfiursLK8Pqa2QTUClk5IScanTUiA5dUlGNPzn/h89c92OwfTd8qTnAuf/BlTV3Y6+/fVTjJSF1zqgu6JCZjLE9c9DaGdW9DTJTnDi2X67p/R1SgS5tUjDJ4n6GiQWcLT0A5sigAsnTR3RGYYXbNKozyL4H/g1fwjb6shYZH8MwDMOYobqmVdXUwmdhOmBE1uQEndUCQic1mLpGQkdGdOxwVR7AV6770NeeJ5ZR48/J172OjLadgHdn1GvMz/1qtBinWQPN1ka/DplY+cBUS0e1ZAfw/Z3HISXZ1exjY5ho4YhOKyHNFa5Zvw7U6di2fQ+42X2NYRiGiR3URqAVbi+qayNHdYz1MWp6mip0yIxARnty/EX4S6kmcvL8OfhNzR9E409nRnRRHDMSQeRI6rKNZltpJtZhodNKSKdTKwY2+btjh68jbF43sGV2i4yLYRiGYSK5phEVNbXCRCAaZATH49OnriUHhA4tpqhOW5TijwfvRnffPuz15+IC94P4wTdatw3DMK0b/qS3ElJNIjrU1XmWT4vqYP0XzT0khmEYhokydc0rIjHRYDNs7zREdIiaskK87XoCXT07cQg5uLTmPtF6QcKRCIZJDFjotBLSA24zVulr2PIt4Klq3kExDMMwTBSNQMmMgMRONFC0RmdGEDAnoBQ2EjAZqMT0VTdjqH0XSh1tcTUewG5/R9N93XPaIHF996naNcMwrQs2I2iFNTqUxkb5zsRqfx94MrogqXw/QLU6g05vwVEyDMMwDHRCRZoRSAFTFzLFLWRGYAua8+QkefCi/2/oUrEZhf4M/KfH09i0OY0S2kz3dcMJfXHu6K7omJXSCEfEMEyswRGdVkKaEtG58fg+uGpiz8B/NpT1Ok27yelrDMMwTIwghUrQjCBKoUO1PV6fP2hmEKy3qanEv+x/xTj7ZlTaM3BFzZ9QkNZPVwtkBoschmm9sNBpJaQpZgQju7XBw2cPE/72RGHPU7U7Nn8N1Na01BAZhmEYxrRGhxqGRlujQ5Ao8qiua55q4P3LMNa/DmX+VDzb6f+wzt8r6NDGMExiwkKnlZCupK7Jpmmyq3FRu9FAenugugTY+VNLDZFhGKZJeeGFF9CrVy+kpKRgwoQJWLJkScT1n3vuOQwcOBCpqano3r077rjjDlRXVzfbeBNFzDz05QYsLwgXHNI1jais8Ubtuha0kJaua6gFPvy1SM+uQgp+XfNHrPb306W1MQyTmLDQaSWobjMyjU0KHY/PBgw6Q7uT09cYhmmFvP/++7jzzjvx4IMPYvny5Rg5ciSmTZuGQ4cOma7/zjvv4J577hHrb9iwAa+++qrYx5/+9KdmH3trZs2+EvxvyR58vSd8uuGpVSM60buuBZuCen1wwIujV9ytZSw4U/Bo1gNY5h+IcnetWM9pt+PSCT3E7ZHdsxvlmBiGiR9Y6LQSqIFZu3QXbPCjbZpLl7fspvD+kLO0FTfOAHzR/5gwDMPEA8888wyuvfZa/OY3v8GQIUPw0ksvIS0tDa+99prp+gsWLMCkSZNw6aWXiijQ1KlTcckll9QZBWLqhxQvbl8drmvuWlRH6bomhY63thZPJ/0LXfbPBhwu4Ff/w9a0o8T9UuiQC9uDZw7Bu9cejQ+uPxqf3zwJS/50ypEfGMMwcQG7rrUinr9kJGb/tAjtM5N1EZ0aOmvW7zggJRuoLAB2LwR6HdvCo2UYhmkcampqsGzZMtx7773BZXa7HZMnT8bChQtNtznmmGPw9ttvC2Ezfvx4bN++HTNnzsQVV1xhur7b7RYXSWlpqbj2eDziUl/kNg3ZNp6odmvHR+fbjMfq9mhihKhwe1BeHX0NaVlFNa4tfg6THQvgsznhO+81+HuegGTnMnF/aZX2WHb4Yff7MLZHFuD3YUin9CZ73hPlNU2kY+XjjF2iHSsLnVbE2J5tcahd6AyZKxDR+WT5XlHDc+zA6cCqd7T0NRY6DMO0EgoKCuD1etGxo75XCv2/ceNG020okkPbHXvssfD7/aitrcUNN9xgmbr2xBNP4OGHHw5bPnv2bBE5aijffvstWjNri6hGxgEySDMe645d9Bul/U7t3JsHZ+l+sW7d+GH/9DpMdn+PWr8dX7S/CY6tPmDrTBQf1vZZWkWiyYadO0jAbkVz0tpf00Q8Vj7O2KOysjKq9VjotGJkROebdQexcNthrL7kLE3obPgSOPX/6JRnSw+RYRimRZg7dy4ef/xxvPjii8K4YOvWrfjd736HRx99FPfff3/Y+hQtohogNaJDBgaU8paVldWgs5E0qZgyZQqSkpLQWnGuPwhsXAVKLJDHerC0Gh8t3w9nVhFw6LBYLyO7HXr1zgF2b6tjj3484HwLI0u/hw823Om5EeefcjOO6dtO3PtdxWqsKToAr18zIRg0oB+mn6wZEzQ1ifKaJtKx8nHGLjKqXhcsdFoxMqJDlFbXorrHiUhxZQBl+4H9y4FuY4P3Uz7z3qJKDOpU/x9shmGYliQ3NxcOhwMHDx7ULaf/O3XqZLoNiRlKU7vmmmvE/8OHD0dFRQWuu+463HfffSL1TSU5OVlcjNCk4EgmBke6fazjt2nPY60/dKzX/28R1u3XT1KqPD64lZodi73hbud7+K1zlvjvqZRb8EX1RFzmCj2H6cn659LldDb789vaX9NEPFY+ztgj2nHyKf0EiOhISjwOoP9U7Z/1n+vuO+ufP+PU5+Zh/taC5hwiwzDMEeNyuTBmzBjMmTMnuMzn84n/J06caJn2YBQzJJYISmVjGgfZ68YPW7BvjlHkEBU1tXBHsJem/nBfDp+PG51fiv9XjXwAX9k1UwGnclIvRXEgNd7HMEziwd8ArZhgt+gAxZWekPvahi/o1zx43/aCCnH9+cp9zTtIhmGYRoDSyl5++WW8+eabwi76xhtvFBEacmEjrrzySp1ZwZlnnol//etfeO+997Bjxw6RtkFRHlouBQ9z5HioOMfktpEqspeO4Lp2rf1zDN/yorj9iOcKbOx2YVA4iYahVkKHG4YyTEJjb+qmbG+88QZsNpvuQtsxLRDRIReaflNErwEU7QQOrIlo98kwDBMvXHzxxXjqqafwwAMPYNSoUVi5ciVmzZoVNCjYvXs38vLyguv/+c9/xl133SWuyY766quvFn13/v3vf7fgUbQ+ahVxUxMQJmaQvbRVH53fOr7GGYf+I25/lnsdXvOeJkRRsGGoclJP7SlHcMNQhklsnA1tykY9CkjkUGdp+nHYtGkTOnToYLoNFWrS/RISO0wLCZ3kHKDfZGDjV8CyN4AzntGt42OhwzBMnHLLLbeIi5X5gIrT6RTNQunCNB21Pl9YGpsZJHKoN46Ryx3f4oGkt7R/TrwX8w6dBuzdi+paX3B/+oiO/nePIzoMk9jYm7opmxQ2VBAqL0YLUKbpzQiCQgdA4fDfimvfireBcn3XcI7oMAzDMI2F6OMWReoa3ZdXUq1bdqFjLh5Lel3cXtj5SuCEu5Hq0n7XKKIjo0VOpdYq1cU1OgzDNDCi05CmbER5eTl69uwpikOPOuooYek5dOhQy/W5MVvDMB6nw6b/Uflu/QFsP1SGn7ck4WFfP4zGVngXvAjfSfeF9lHrjfnnKVFez0Q61kQ5zng81ngZJxObqCfPVNFjxpp9JcHbZ9nn46/Ol8XtV2tPQ2nvWzDRZgumplH0JxjRUbIXjDU6Do7oMExC42zqpmwDBw4U0Z4RI0agpKRE5FBTR+p169ahW7dupttwY7YjQx7nnt2hZmzErHUh69WX7Gfi365n4Vv8b8wuHwQgUyzfn3dAdAePBxLl9UykY02U44ynY422KRvDmCENAyLV6GQkO0WLAyLd5cBZrqV41PMv2G1+vFU7GY/WXo4/BiI1KYrQkSIqSREzRqGjprUxDJN4NHkfHbL2VO09SeQMHjxYFHxSYzYzuDFbwzAe57YftmH2PvPma7N9Y7Dd3wV9vPtxai51ox4olrdr3wHTpx+FWCZRXs9EOtZEOc54PNZom7IxjBlquppVRGdC7xzM2ailUf+2/Ub87vCzcNp8+KD2BDxQ+2tKgEeyUy90Kmq88AaEjjOCGYGDG2MzTELjbOqmbEboh3306NGiC7UV3JjtyJDHmeqyPlY/7Pg07ULcVfV3OJb8Gy78FTVIEr0O4uU5SpTXM5GONVGOM56ONR7GyMQG+4urRKpYx6wUUwMCKzOCo/u0E0LnePsq/K7wGTjhxWfeY3BP7bXit0o1GZBCpqzaY+qsZhQ6arSHYZjEw97UTdmMUOrbmjVr0Llz5/qPljki1zUjSzNPATK7AOUHcK7j5zCHHIZhGIaJBkolO+b/vseEx+fo0tV0NToWQmdEtzZok+TF35NegNPvwVzHRNzluRE+ZYoiIzrSbOBweY2p8Y40K5BwjQ7DJDb2pm7K9sgjj4jamu3bt2P58uW4/PLLsWvXLlxzzTWNeyRMGK46cpMrvA5g4s3i9vWOL2GHT9fzgGEYhmGioagyJDxkvU14RMf894XS0Z4fm4+2tnL4s7rgseQ74YU+MpMcOHHXJzddXC/bXSSuO7dJ0dXlZKboI5DcR4dhEhtnQ5qy5efni6ZsBw4cEI3ZjE3ZyIlNUlRUJOyoad22bduKiNCCBQuENTXTsrhrvcCYq4CfnkSf6gOYZl+KAv+pLT0shmEYJs5QOxOQ0MlOc4nb6skzq9Q1EiPHVX0vbtuGXwTfKtrWYyp0RnTLFr1xZKToqJ5tdeu1DTxucN9co8MwCY2zqZuyPfvss+LCND+VNeHN1wZ0zMDmg+XitpsKQ5Mz4R93DWzznsINzi/xkHdqC4yUYRiGiWfUZp9l1eYRHSszghRPCbBltvbPiItgW50fvk5SKHVtaJcsrNqrWVGP6aEXOtlphogOp64xTELDpzoSTOhcPK4Hvrr1WHHb7dF+dDxjr0eV34WR9u0Y6l4Z9f5X7C7Ct+v1xhQMwzBM4iF/T9TUNTIMUNPVrFLX2uz4GvDWAB2HAR2Hwm4LFycyomOM4owxRHSSHHZkpoTO4XLDUIZJbPgboBVTWRM6qybJzXAF3WuqKXWNDCJS2+F974ni9vmVH2JfcRX8/rprdW54exmue+sXHCrVd7NmGIZhEjAVOgAJnP8u3InhD83GJyv21hnRydj8iXZj+IXiylToKHU4UtzQb9mQLuEtJ9T0NTYjYJjEhoVOK+aMEV2C6WqSnHRX0L0mGNHx+fCK93TU+u0YXbsS1//1FTz0xbqI+/b5/DhY6gbpofxyd5MeB8MwDBPbVCsRHUpde+Bz7TdEPWdmVqPTFflI2b9I9MrB8AvEMhOdo4vonDiwg+i9c91xfUQEx0hbJX2NG4YyTGLDQqcVM7J7Nn78w4n44pZjcdXEnjiufy4m9mkX/MGgM3AUuaFi0b3+9vjSp1mEU63Omwt3Rdx3pZKPXeEOT5FjGIZhEjWiE55NIO2ljdkCZzkWajd6HQu06WYZ0VGd1TKSnXj/+om4c6rW6NpI23SO6DAMcwRmBEz80LOdZsX58NnDgstkRIdMa8i5RvY8eKn2TJzrmI/p9iXoZcuLuN9y5YeswiRFjmEYhkkchLmNib20CtXoeFV7NvhxTqCHG5kQRBInakSnLtTUNbOID8MwiQN/AyQgyYEaHfnj5An88Gzy98D33lGw2/y4zjEjuM6avSV46cdturSDcnfI+rPC4keNYRiGSTzXtdIqvTW0WqOjGhIMtu3GQPte+B0uYPBZweVmQZi6GmBbOa9xRIdhEhuO6CQg6pkxt8cLr/LD86/as3CyYyXOd/wElB0AMjvhzOd/DqYLXH50z7DUhEpOXWMYhklo1IjOzsMVlqlrqiGBjOb4+58KW2p2cLnNJHUtqR79cHLUiA730WGYhIa/ARIQ+hGRZ8d+/+EqPDdnc/C+pf6B+MU3AMm2WmDRi7rtth7S+u8YUxOs0hQYhmGYxBM6slebEcoKILFD2OEL1ufYRmhua5KHzxoq+t/cOWUA+nfIwKBOmTrL6LrIVmt02IyAYRIajugkcFSHzqz9sMnYmM0manVecT0N/PI6cNxdwXuoUZtZjY6ZjTXDMAyTOFB2gNlJMRX6zZFCZ4J9AzrbClHiT0ObAdPCjHQ2PHqqqK+5+aR+5McGez1S0HSua5y6xjAJDUd0EhRpSGDGHN9obPZ1BdylwNJXg8tTFdebMl1Eh1PXGIZhEhk1omMF1ed4AuudY58vrmd4JwDO5LB1pYkA1djUR+QQ3EeHYRgJC50EJZKDjR92EdURtxf9C8moCRM6HNFhGIZhzCI6VogaHa9P/Kac5lgsln3mPbbRx6KmuTnZdY1hEhr+BkhQVOc1M77wHQNkdYOt4hDOd8wTy1LU1DWu0WEYhmHqFdHRzAhOtq9Alq0K+/ztRF1oY5OZwq5rDMNosNBJUCKlrhG1VL51zC3i9vWOL+GA/mydainNrmsMwzCJjWovbYVmL+3DuQG3tS+8x4gMgsamS3ZK8HZKPWypGYZpfbAZQYKSUkdEh/CPvgLeH/4PPd2HcJp9CWq9w01rdLhhKMMwTGITbY2Ot6IQJ9pXiv8/bYK0NXkib+UDU8RtTl1jmMSGvwESlGi6TLvtqcgbeJW4fYPzS9Sqna+VGh1OXWMYhklsok1dy94xAy6bFxt8PbDZ373JxpOd5hIXhmESGxY6CUpdqWsyFWFrr0tQ6U/GMPtOdDqs9TwwihtOXWMYhkls3LX634G+7dNNU9dyd3wubn/qndRsY2MYJnFhoZOgRBXRqfWh0J+J97wnif9H7Xo9eB9HdBiGYRhJtUcf0RnRLTtsne1bNyI7/xf4/DZRn8MwDNPUsNBJUJIVq+hIEZ2yag9eqZ0Oj9+B7iW/AHuXhdXosL00wzBMYmOM6Fw4tlvYOmc7FojrRb7BOIB2zTY2hmESFxY6CUo0ER06Q1dWXYv9yNXspon5z4qrcrcnuF4Fp64xDMMkNO5AROfPpw/GRzdMxNieOYY1/Dgn4Lb2mY/T1hiGaR5Y6CQo0biuiYhOIHIjG4hiw1dAwRZd6ppoAhdFISrDMAzTOqkORHT6dsjA2F45SHLo+9cMse3CAPs+uP1JmOUd30KjZBgm0WChk6BEY0ZANToU0SG2+LthU/Zx4qycf/7fw+pyOH2NYRgmcZERHZktYLPphc45jvnieo5vNEoRblTAMAzTFLDQSVCiS13TanQk89pfpt1Y9R5yvId161bUcPoawzBMottLqyfRHHZN7Njhw1mB+pzP2G2NYZhmhIVOghKtvbSM6BA70oYBPY6BzefB1c6vxbKsFK3nbAU7rzEMwyQs9HthTIt2BKI6R9vXo5OtCCX+NMz1jdJtl+aq+7eIYRimobDQSVBcJhGdyYM74N9XjMGYnm2V1LVQRKfW6weOvUPcvtQxB+2dlchMSWpSoVNUUYMTn/wBz3y7uUn2zzAMwzRtROccu5a2NsN7NGqg/Wacf1Q3PHL2UMz63fEtMl6GYRIDFjoJiiF9WkBdpKcN7YTMQJTGGNGp9fmB/lNQ024wMmzVuMLxHTKSZUSnaVLX1uwrwc7Dlfhm7YEm2T/DMAzTePbSalo0CZ1k1OA0x5KwtDX6nblyYi/0aJfWAqNlGCZRYKGToHhMXNKkS05K4IxctWJGQNT6fEIhFY6+Ufx/uW0msl2eJjUj8JK4omu/ds0wDMPEFn6/PxjRSVF6tNEJtVPsy5Fpq8Jefy6W+gdGzCpgGIZpbPibJkHxeMOFjtNu1+VYuz1elKqpawHRUdT7TOzxtUcOSjHV/V1gf/4mFTq+wDXDMAzTcqzeW4x1+0t0y6jFgDwXlazU6DjttqDb2hfeY+BXphwuB08/GIZpevibJkFxmwmdQERH5lgfrqhBpeKmVhvYptbvwMve6eL2mRUfwwGvqXBqDGQkR4oshmEYpmWoqvHi4n8vwiX/WRT8PSBkNMeYutbWVo4T7SvF7U+9x+r2lcRCh2GYZoC/aRIUr0kEhs6+qRGd3YcrdfcLMwKK3vh8+MB7IoqRhQ7egzjdvqjJhI6M5MjIDsMwDNMyFFbWoEpE+mt1vdRkDx1KVVMjNVP8i+CyebHe1xPDenbGH6f1D97H6cgMwzQHLHQSlKuP6x20hpY4Az9QMsd6V2GF7n4ZVSHBU41kfOI6U/x/o/NL05qfxkD+GLLQYRiGaVlUF061flNaS1M0R20Uepr/J3H9qXcSTuzsxzWTegXv45YEDMM0Byx0EpTObVKx/P4puO2U0Bm2pEBEJzkgdMIiOmRGoKSwzUieDrctBYPtu9Hh0LwmGacUOJy6xjAM07KUK+JGFTpm1tIo2oVR/g3w+W2iPodQRRALHYZhmgMWOgkMRXDUfGoZ0ZHLKD1BdccJpa5p11XONliQfZa4PXT7q01rRsBpDgzDMM0OpQ9vPlgmrlVxo0Z3zKylseZDcbXQNwQHkRO2XzX1jWEYpqlgoZPgqPnUsrmbag9KdMtONaSu+YJ21D+3vwg1fgc6Fy8H9mi9Eoi/f7cFt7674ojd0oIRnSaqAWIYhmGsee67zZj67E/45/dbUaaIE12NjozoSMc1OjG1+gNx8zNfqHeOSlaq1jiUYRimKWGhk+CovQyCfXQUe1Cia1tN6OwvrsJdH6zC8t1FwQhQZUonfCbddH5+LrjNs99txper9mNZYN2GIiM5nLnGMAzT/Pzj+63B73SrGp2agNAJOqkdWA0UbEINkjDLO163v5cuH4MTB7bHHZMHNM8BMAyT0Oir0ZmEFjrBPjpqnjWALm00oZNXUo2Pl+9V1rcJcfRv7xm40PkTbJtmAIc2wtMu9AN2pBlnMpAj64OYxmNnQYV4TSf2bdfSQ2EYJt5qdJSIjoy8JwV+Q2Q0Z5FzHMqQptvHqcM6iQvDMExzwBGdBEdNXZMRHbXhmxrRMUJn7+iyzd8Vm9ueoC2c/3fdj6EuZ7sBeAMCh3VO43P9W8tw6SuLkFdS1dJDYRgmRslJd5lGcdTvedleQPRi83mBNR+J/39wndisY2UYhjHCQifBUSM6DouITtdAjY4R+lGTTUbnd7xcW7jmA1Tm7wquc6QmAiHXNVY6jU1+uVtE3A6X17T0UBiGiVHapiWZ1uWoaWzSqEYY2uycB5QfAFKysTx5XDOPlmEYRg8LnQRHl7oWEC0jurXRrdM5O8V0W0p1kxGhXamDgV7HAb5aJP/yr+A6R2oLLfua0m787LzWqEgRyT2KGIaxol16cvA21WmaiR55Ikq0KAikrWHoOUhOMT9JxjAM01yw0ElwzMwIOmSl4Ktbj8WgTpk4fXhnpLnMS7lofVl8Kiynj71d3G678R20h2ZCcKSNRFXXNp6QNy7yueUO5QzDWKG0vhE202ZpbJ7AGalUew2w/gtt4YiL8fi5w9GzXRoeP2doM46YYRgmBAudBCfZEW5GQAzr2gazbj8eL1x2lDAdMIPSFGQUSAiavqcAnUfCUVuFV11PIQ3VwZ47DUWdhPOEvHGRzycLSIZhrKhWTlbtVJpIq0JHRnTGu5cANWVAm+5A96PRr0MGfvzDSbhwTNdmHjXDMIwGC50ER++6Zi5ogpahxuV2WzB1TRSj0qm/81+D29UWI+w78FLSs/DWVB/R+NRJOE/IG5dQjyJ+XhmGMcft0ZqBGlFrdGREZ1LV99qC4RcCyokzhmGYloK/iRIcfY2O+dtBNhI1NSMI3BeM3OT2w3ej/4lKfzKOd6zBwCX3HZHHNAudpkMaRfDzyjCMFbJHjhFdjY7Xj2yUYURVoGn0iIuaa3gMwzARYaGT4JiZERiRtTtGSBglBbZXa3F2pgzGTZ7bUOu3o+vuz4HvHhLLK2tq620owEKn6WBHO4Zh6qLaMqJTi7mbDuG4v32P+VsLcLpjMZzwAp2GAx0GN/s4GYZhzOCGoQmOro+OvX4RHUpdk2ltqrua+AH0jca9tdfgyaT/APOfQ6EjF0fN7oNTh3bCS1eMiXp8qj01C53GgwSnfDqP1AKcYZjWiztCROfXry8Vt/cUVuFD18/aHcM5msMwTOzAEZ0ER99Hp341OiKiI80IAg3j1NztD70nYs2AW8Xttj/dj+n2RZi17kC9xscRnaZBfS65RodhmPoKHbVGp5vtEMbZN8MHGzD8gmYcHcMwTGRY6CQ40aSuRarRkSJIzeNWc7dX97kGGHcNbPDj2aQXcbR9fcMn5AksdL5anYenvtnUaL2EdG52Cfy8MgwTGXeteeqaNCAgzrYvENfb0kcDWV2abWwMwzB1wUInwUl2OOpcxyqljZZbpa7pfgxP+xu2tDsJybZa/CfpGeDguqjHxxEdjTs+XIPnf9iKhdsON8r+1LKcRBaQTOvihRdeQK9evZCSkoIJEyZgyZJAcbwJJ554Imw2W9jl9NNPb9YxxzL0nSsFTY+cNIu1/DjXoaWtrWo7rRlHxzAMUzcsdBIcNaJjJSSsIj1aRCeUukaXv83aiO83HtJPou0OzBn8GJb4BiLLVgm8fT5QvCeq8XHkQc/hippG2Y/6vHKNDtMaeP/993HnnXfiwQcfxPLlyzFy5EhMmzYNhw6Fvo9UPvnkE+Tl5QUva9euhcPhwIUXXtjsY4+HaM7wbm2CtzOSQ+W9Q2070c++H25/EjblnNjsY2QYhokEC50ERxU6VhPeSLU7aurazDV5eHHuNt06NYHaHbsrFdfU3IXNvq5AWZ4mdioL6xyfT43o8IRc16X8SOAaHaa18cwzz+Daa6/Fb37zGwwZMgQvvfQS0tLS8Nprr5mun5OTg06dOgUv3377rVifhU4ItycU+r3xhL7ielyvtshMCQmdcxzzxfW3vqPgTcpqgVEyDMNYw65rCY4qYqx0hKUZgZ366IRS10qqQsWpxkk0rVeKDFxVcw8WtH8CtoJNwLu/Aq78HEhKtRyfmlbFER3ARsW+jYBOQPLzysQ5NTU1WLZsGe69997gMrvdjsmTJ2PhwoVR7ePVV1/Fr371K6Snp5ve73a7xUVSWloqrj0ej7jUF7lNQ7ZtLsqqtOOlyP3ADmn47vZj0S7DhYv+s1gst8OHsxxafc7n3knoafObHk88HGtjkCjHmUjHyscZu0Q7VmdD86CffPJJHDhwQKQH/POf/8T48ePr3O69997DJZdcgrPPPhufffZZQx6aaUJyM5JNl1sEdITrmssZ7rqmUhtYLlPc8tAOVRd/gLS3Tgf2LAY+vga46L8ivS2R7aW/XX8QKUl2HNe/ffNEdJTnlWt0mHinoKAAXq8XHTt21C2n/zdu3Fjn9lTLQ6lrJHaseOKJJ/Dwww+HLZ89e7aIBDUUiiTFKvlV9NcpBM3MmTODyz2V9H1tw0T7OnS0FaPIn4G5vlE4ccd2zJy5NS6PtTFJlONMpGPl44w9Kisrm0boyDxoSgugYs/nnntO5EFv2rQJHTp0sNxu586d+P3vf4/jjjuuvg/JNDGv/3oc8kqqMbBTpun9VKBLQkV12SFoWdCMwOtHSWW4uq6RER0lKlSZPQBpl7wLvHUusPErYMZdwBnPms7iE8GMIL/MjWv/+4u4veOJ6eL5VlEjbVais77onldOCWQSHBI4w4cPj3jCjqJF9NunRnS6d++OqVOnIisrq0FnI2lSMWXKFCQlJSEW2XywDFi5EOkpLkyfflJw+ccFy7Bzy2GcG0hbm+mdAA+cGDSgD6af3C8uj7UxSJTjTKRj5eOMXWRUvdGFjpoHTZDgmTFjhsiDvueee0y3oTNtl112mTgbNm/ePBQXF9f3YZkm5KRB1gJVnzKlnxBTOppMXaNanFKlr4IxoqNGZkSn7V6TgPNfBj64Clj2umZJesIfw7ZXA0WtVegUKgYDdIxG8wf9UdsaX+hYROMYJl7Izc0VRgIHDx7ULaf/qf4mEhUVFSLb4JFHHom4XnJysrgYoUnBkUwMjnT7pqTWr32/pyY5dWPMTHUhBW5Ms2sNQz/1ThLXLqd+vXg61sYkUY4zkY6VjzP2iHaczubIg6YfEIr2XH311ULo1EUi5kI3Bk15nGZn/W3UHs6vufJ4an0oMnEEc3tqxXhqPCHL6fKqGngykoD+02Gf+gQcs+8BfvgLatPawz/qct32td6Q64+7Rnv9W9vrWaMcR7W7BslJoTQ+OkZV3/m83kY5bnoug49f2zj7PBJa22vamo41HsbpcrkwZswYzJkzB+ecc45Y5vP5xP+33HJLxG0//PBD8Xtz+eX67x4m1Cw0WTGtIbJSnJhsX45MWxX2+nOxzD8gLHLPMAwTCzibOg/6559/FmkBK1eujPpxEjEXujFpiuP0+sLfKuvWrEbFDpqFO1FVU4PNO8ky2o4Mp18EHso9NmzbuQszZ+7A6jyKRGgT+Dlzf8SmYL1vFwzueCYGHPwS9hl3YsmGXTjYZnTwMfbspR9O7cfz5wULkLe2aY+zJdhbQX+153fmrG+QbChXUjMGly9fBs/OI49sFVSHHnPtuvWYWRx9b6OmpLW8pq3pWKPNg25pKK3sqquuwtixY0UKGqVVU7RGZh9ceeWV6Nq1q/h9UaHfJxJH7dq1a6GRx769tOrOKe2lTw6krX3uPQb+wHe0rMVkGIZJCNe1srIyXHHFFXj55ZdFakG0JGIudGPQlMf5u4Wzw5aNPWo0Rndvg8dWzoPf5kBamzZAYREeOXcE9hVV4envtqJz126YPn0Y8ubvBHZuFtt17D8K3XLTMUL2ZfCfBt9Xt8K++j1M2P0SvJd/Cn/XseKuWaWrgMNaOsr4CUdjQu+cVvd6rtlXAqzWXIxOmTwFWamhY6Jj/eLr0ISYzlpPHlx3qmFd7CioAFZoE5X+AwZi+gl90JK0tte0NR1rtHnQLc3FF1+M/Px8PPDAA8IoZ9SoUZg1a1bwxNzu3btFBoIK1ZbSyTg6icZY20unKFFmor2jAifaV4nbn3qP1TlxMgzDxK3QqW8e9LZt24QJwZlnnhlcRukE4oGdTvEj07ev5s2f6LnQjUlzHWeKy4nUFFewFqe0Wjv7l5ORgoIKLd3F57eJscgzfsTvP14rfhAX3nsK2mcGXueznwcqC2Db+h2c718KXD0byO0Pv1KTYrM7dMfVWl5POi6J3RGe466mrtHnpjGO2e5QJi42e8w8j63lNW1NxxoPY5RQmppVqtrcuXPDlg0cOBB+NuOwpDoQ0TGmrg0r/h5JNi/W+Xpiq79bcDmnrjEME2vYG5oHLZF50BMnTgxbf9CgQVizZo1IW5OXs846CyeddJK4TVEaJn4hI4KkwBlSmowXVWo1OhSRkG5s0nbaGxC4qqXx/mLhXarhSAIufBPoMhqoKgTePg8oO9CqbJC35ZdjT2Fl5OadJseopq411qRM9R+I9+eVYZimjeiodYPEgINfh0VzCE5dYxgm7lPX6pMHnZKSgmHDhum2z87OFtfG5Uz8Qe5gScqZvsPlmtBpk5oUPLMXEjrh20thFCQ5A7j0Q+C1qUDhduB/F8DleiysyeX6vFK8vcWOEUVV6N0hPs42l1V7cMrTP5paSJNjXSRnOZ0ZQaMJndZv280wTOOYEaSoEZ2incgtWiGi9V969Sc4HYbUQIZhmJbG3pA86KeeekrkQVMONEVmjHnQeXl5TTFWJsagqI16Bk9O2EnouALLqb+OWUSHKKkycXPKaA9c/jGQ3h44sAY3HXwISajVRR7O/dciLC2w4/YPViOeeuUYJw+SGuX/WpPnSY3oNJYTdF1RJIZhGNEKwBjRWfOhuFrgG4KDyNGtzxEdhmFahRlBffOgVd54442GPCQTg1CdjUxdU8lKSdL117GaTJvZUQty+gCXfQi8fjqGulfgqaSXcLvnpqBYkrvacqgc8YJM5SMq3LW64l61EauJztFFdBqruae6n8aKEjEMkwD20us+E1ef+7TeOSrye59hGCZW4G8lpsFQeprdboNDcdpJTXIIK1KZ0haK6IRPpovNIjoSqtW5+C3UwoGzHQtwr/PdsGiG+rjxRGVNqDeQmt5nFdFRl8j0vUaN6KghI4ZhGIO9dFDoVBQABzWP/zneo8LWNzY7ZhiGaWlY6DANRqYpqJailLYm7gsskxN3s4hOcWUdjQj7nYKX2twhbl7nnIGem1/T3R1PVqaqsKioCTVPNaaumQlCfepa44gSNYpjllbIMAxTbbSX3qVZ0tfmDkYhwls9cOoawzCxBgsdpsHINAWXkpYlhY40I6iJFNExmhGY8GPqKXjCc4m4PWzt34A1HymPHz8/qqrQq3DrIzqqGYGZINSlrjVFRIdrdBiGiSais/Nn7bqX3m1NwqlrDMPEGvytxDQYefZOdV7LSnXq7qP+OlYT9KK6IjqBSfi/vWfg9dpp2oJPrsWjztfQBuUibS5eUI+/ypC6VldEpylqdNQUOK7RYRgmco1OIKKzY564cvQ5zjR6w6lrDMPEGix0mAYjozamqWsGe+na+tbo6CbkNjxSewW2dT8f8PtwhfM7/JB8J873zQZ8etEQq6i1N8bUNbVGx9tcER21PxHX6DAME6GPTkqSHSjPB/I3iP9tPY9FRnK4lxFHdBiGiTX4W4lpMFLgqI5ibVJdumUR7aUNqWuUylapiACyNpUTcj/sWDTsQeCqr7DR1x05tnL8sfbfwMsnAXuWINZRBYp6jOFmBJFrdLiPDsMwzUW1mroWqM9Bh6FAejtkpoT3MOOIDsMwsQYLHabBSDFDLmuS9pnJuh88TwQzAjV1jdK5Rj3yLcY8+p34/435OzDo/llYu69UH93pfRxOr3kcD3muRDnSgLxVwKtTgM9uAsoP6XLL73h/Jb5YtR8xX6NTZ+paaPLANToMwzQH9J28cNvhUB+dnVraGn0HE2YRHbN2AwzDMC0JfysxDUaKGTV1rUNA6MgfPE+ttRkBNQz9aXO+uG9PUaVYVuXxij4zD325Pmx9OSH3woE3vKfi1+n/AkZfrt258n/AP8cAC18EvB68tXAXPl2xD7e9uwIxX6OjhGyay3WNIzoMw0TiilcXozDQ60ykrhmMCGQ9pgpHdBiGiTVY6DANRooZNXWtQ1ZA6Dj19tJWk+krX1uC95fu0Yml/DK36bq0D7+SulXubAuc/QJwzRyt7467FPjmXuCl4+DaE0izaCALthVg5Z5iNBZqHcyR1Og0Vuqa3l6ahQ7DMHo2HywT17kZyTiuC30xbxT1kuipNQq9bEJPHNO3nW4btpdmGCbWYKHDNBh59k79cWufEUhdC4ggmZYVaTL9n5+26SyW88uthY5HEQxB17VuY4FrvgfO/AeQmiMKZq/cfAueT/oHOkNLvagPh8vduPTlxTjnhfk6YdV4NTrWqWumDUN1EZ1GGY5uP5y6xjCMEfk99eWtk5CbH6iD7DgMSMsRN88c2QXvXHs0MpUUNjYjYBgm1uBvJaYRhI4a0UnR9daRk+hIk+m26S7dZN8youP3i9S24OOr9tL0AzvmKuDWZcC4a+GDHWc4FmFO8u+Bn54Cas33aYbqBqc+XqO5rrnrF9HRp675Gt11jRuGMgyjQt/H8js7zeWM2D9HTVdzxJHlP8MwiQELHSYq/nXZUeianYqJfUKpCsE6HGWibjQjCLmuWQudHQUVun1YCh2vXzixmfHt+oN47ecd2tnG05/CP/q+iiW+gUizuYHvHwVePBrY/E1Ux6o2QC2v1ouSFumjo9sPGr2PDkd0GIZRUZ0h01yOiEJHPdGl3mYYhokF+FuJiYrThnfG/HtOxrjeWtoCnbiTqWNqBEQ68cgfPEpJo/Qv42T6lpP6YUJgX8WVHhwocUcV0VGFjprGds/Hq/HIV+uxs6BC/L87uQ8uqnkAt9XcDGR0Agq3A+9cBLxzsXY7Amq2Wpkh+tIormuGGh01ba+5Goaqj8MNQxmGUakInIyhkz5JlflAwaZAfc4xYeuq4obNCBiGiTVY6DD1wiWd1pQft6KAM4+KWrdDk2pjetSVE3vi/esniigRsfFAyEY6r6Ta9LFpP2oqmYwCUXSiMNCT52BptRJJsuEL3yTg1l+AY24D7E5g8yzghQnAnEeBGk0U1SfNrClqdFTBVluXGQE3DGUYpompCpyMSUt2ALsC0ZxOofocFbW9ANtLMwwTa/C3ElMv5Nm7JCUXu9QkvUsVQjSRN0YqZLO5Pu3TxfWGPM3hh9hRUG762CQC1LQvKRAoQiLn7UUBwaN7vORMYOqjwI0LgT4nAd4aYN5TwPPjgXWf6UM4hm2bInXNKJ5qAk35wsYtlzVxRIdd1xiGUZG9vtKS1LQ1rX9OpJNaHNFhGCbWYKHDNEjoqELGfL3QDx41DTVOpkVfBhI6uZrQ2XQwFNHZlm8eaaFoRrXHFxbRKVPEyOFAdMnMvQztBwBXfApc/DbQpgdQuhf48Crgv2cDh8g6NVxMlDVzRKdOe2luGMowTBMjv6PSKBV5x7yIQkd1WmOhwzBMrBHe8YthIiDTFOrql6CmMFBqlJxMnz2qCy4Y0w02m7Z995w0cb2nsErXSNQM2oe+RkcTM+WKGCksDwgdRTxQjZB8PND14DOBvqcA8/8O/PwssONH4KVJwMDTgKyuaOvNxK8cRSj0Z8K13wd0GgKkt9ciQ3I/9aQ2otCpj+ta4/fR4RodhmHMzAi6OUuAw1sC9TkTTddNUlLX2F6aYZhYg4UOUy+kI5n6gzayWxus2lsiRIyEjArIalTrfROK6NA6x/VvH1xPWJdGSXiNjrbPsuqQMJK1Oh5FENB6rkAD09CBpAEn3QuM/BXwzX3AphnAhi/FXR0B/J+WWQdQ31HZe9Th0gRPeq52nZYbuh1crtxHjxEcu8/U0Yhw6/roNNyM4JedhfjbN5vw4JlDMLRLG8v1tPHoa3QOlVXj4S/X4/IJPTHR0ASQYZjWzbwt+Xjoi3X46/kjMLZXTtCMYLR/nbZCp+FAatuIdZt0DojtpRmGiTVY6DD1IikgGNQUhZevGotZaw/gvKO66dZ1KkJHRlgchjN+ycrZwKiEjq5GxxdWI1QYSF1ThQWlsbmssjRzegOXvAPsWgDsXwFU5KPg0H6s2LAFubZS9EmrQhtfCVBTrtX2lO7TLtGQlB4UPmPRFRc4OmGRbzAOuztFiOjU1TDUWuh8sWo/luwoFK9FfYQO3b7/s7X4Zt1BzFidh53/dzqOFHK/e23+Dlx3fB90axsSfAzDxB5XvKo1BL36zV+w6sGpQTOCkZ412gq9j4+ibpOjOQzDxB4sdJh6EfxRU5uEZqbgyom9TKM/FK2giIpMj9I1+RS1Oo6oH1vYSyuF+9KWudxE6Kh1L+ptS8g2NWCdumNnIa5dvVDcvvGYvrj71EF448f1ePnrJTihK/D4tC5CEAUvlYeV/wu0axJFngqgmC670Be/4KlAlGifvx38H58CW69JQM9jUaNEqeq0l44gdGQ/HjVCZIWarkZCcNfhSjQmv/rPIhworcbi7YX45g7rSRLDMLGDNEqRZgSD3ast++eE121yNIdhmNiDhQ5TL4I/alGkKISahoa6bNsNNS71iuh4w13XqP6mzETo0GNK1NvRoNb3SBH1v2X52If2eGcf8PiAqZF3QCLCXRYSPuUHsWrJD6jdPg8jbNvR1XYYWPOBdgHwX1tbLEgaiMW+wcgodQH+XrpaIFWnRaqnkcJPbUBqhfqUkHiqx8sQFSRyiE0HQ256DMPENqmBE0+UItwBRejo2QPY7EAP8/octV4zmt8EhmGY5oaFDlMvpDBReydYIZ3ZaAIuIxHGs37JAfe1aDA2DCVIQJW7PWFCR3Vnq6+rmM5eOnCGM5rjDUIiJSVLu7TrKxYtKRiGv2ycjFRUY7R9K14+vhrpeYuBvb+gnbcIZzoWiQsWvw6saReIMB0LdB0Pv0hnc9QZ0ZECrb4RHXpe2ZCAYZjkgNChyM7R9vXawk4jgNTsekX5GYZhYgUWOky9GNcrB6cM6oBTh+nrTCIZF2iua9rk21FH6hrZTqsiRYUm+cb7qL7FaC9NUR4zd7ZoUQv+pdBRf8TJTIAiU/VJu5NiqwopWOAbhvyxJyKdrLU91bj5yf+gT8UqTLBvwISkrUiiVDgyRtjwJSjb7UlbGs5NGiQiPukVJwDeoYAj/KPrqVdERxE6lFroYKHDMIlOqssedIYMCp0IaWsEp64xDBPLsNBh6kV6shOv/npcVOsGU9eoj04g2mBMbzCmro3omo0lOwujcl2T6Wuq0KFJPv1Iq0JHTUWT7DpcgfaZyaaub6ohgExdUyM6wx+ajdwMFxb/abLlsUfaJxE8jqQULPEPwQxvX/zTC/zh+N64eWCZ1o1853z49yxCek0FpjiWiwt2/A/4611AjwlAz0naJKTLUUL4yFokmcIWCTXKRbc5oMMwiQmdGDKmrtHJnIlBoWPePyc8nZkjOgzDxB4sdJgmQ/4A1tSG+ujUFdEZ0iWrnkJHH9GR6WvqeiS0yD7167UHcN/0waLwfvo/5qFXuzTM/cNJkWt0AhEdVZDROA6WusV1tHaqxvQ5Ncqk3q6hjySJGLocdxdq3VV44oV/w3F4k4j4HJO0GWk1ZcDW77QLkdMXOOlP8Ho117saxbDBCrXxKB0Hp64xTGKi9iGT38dJFQfQ234QPthht+ifI5HW/RzRYRgmFmGhwzQZMnpDQiPkuhbZXjo7TTawsUpdMxM6+gajlL5m7Lcj7VP75KYHf9h3WjiN+epIXVMf22GPLn3NWFujppept8NqcOxObHf0xVxvf7zsPQNnDOqA509OBnbNB3ZS1GceULgN+PhqPJTUGw77eajxTKt7PIYaHZY5DJOYFFWEvj/l10LPshXiurjNYOSktGk0gxqGYZjmhmPNTJMhfwBFH51gRAcRIzqUInbPaYNg9ptZayZ0avWpa8Thcreulkdt0FlS5UGayxF19EXuW9YbWa1XF8Z11fQyXR8dk8iKmnlX67MDnUcAR98I/Op/wB3rgJP+DCS3QU/PDrziehr3HbgN2D43+oiO1x/R5IBhmNZLUaDJMiG/X/tVLNfu6zChzu3lySs2I2AYJhbhbyamyZDRGhId3igbhpKguOGEvph398mmkRbVXloKBhl1keIor0SzNpaszwtZHGemOJGq1OUY90eok37ZVyLJxHWtPrbVqrBQozi0XO3zU2cfHaMQSs4ETvgD8LuV+DjtQlT6k9GvZiPw37OBN84A9miRrEjHyDU6DNO6WbmnGH+dtdH0+65QEToyEi7755R3PrpBTaQZhmFiBRY6TJORlaqloVFqmYxo1NUwVBb9y94M4REdM9c1LfWic5tUcb2vuEq3zqo9xboITZIyBvVsppkIoB9+EjRmv+FRNSJVxm4mdDwGkwIz4wR1U6NgCpKWgzdSf40T3M/iq5QzAYdLS2t7dQrwzsXAgUCHc7PUNSF0WOkwTGvlnBfm419zt+H5H7aE3VdsjOiU7EVnXx68fhtqutQd0ZHRbjYjYBgmFuFvJqbJaBMQOpQuJsWDsXjfmBIm/zdLFSPnst2FlWFCR0Z0erZLE9f76xA6atqYmdAxihLqEm4maupjW22M1Mj9GfdrdGcTyyJFdAzjyUc2nk+5Drh1GTD6cq3Z3+ZZwEvHAh/+BijYGp66JvroRH0oDMPEKZsPlkes0REnkqj2D8Aaf2+kZLStc59co8MwTCzDQodpMrJSnCGhEzQj0P8Y2u02nagJRXTC35rklkbRGtpHZpIUCj6UBupoerZLF9f7ivRCZ8uh0I97abVHV+ej/shbiZIyt8fUstks+mKF7CMkqfF6TXvemAkZXepaBEUS7KND19k9gLNfAG5eAgw9T1th3SfAC+OBz29GpjtPt092XWOY1o+ZFFFP9lAE279jnri9yDcUqXXUMxLcR4dhmFiGhQ7TohEdIjkpOqGzNyBghnXNQlqgzKbc7Q2KBauIjgpFdNxK+puan24lJrSITrjQMaad1SuiUxsSapHWC0tdixjR8YeLp9z+wIWvA9fPAwacCvi9wIq3cfuGS/Cg8020R3G9jRUYholPbLbIQkd8/wQiOouoQXFyNEJH2ymbETAME4vwNxPT5DU61NdGYip0nKEfU/ljaVajI5nQKweB+lcUKfvukRMQOgYzAhWq56lW+syo+elWYoMiQKZCpx6pa8boj1tGX2rrV6MTKaJTa7FPATm1Xfo+cPW3ogGg0+/Bb5zf4MfkO/BH53tIrS2N+lgYholPbCYxHTWq3QUFsBXvRK3fjqW+gUhLqrsDBaeuMQwTy7DQYZo8olOX0EkxiejYzE49Bhjfu23QHIBS0aR7W25Gcp1jCovoBMZGgumDpXuEFbUxukHpHGbioT6pa1Z9dIwpcWZCRn2YSEGkGhnRiSTAuo8Hfv0VXurxLFb4+iHN5sZNzi/wNW7BLY5PkQ7raBjDMPGN2ddqcVXo+/lo+3pxvcbfBxVIRVoUER1ysiQyUqx7oDEMw7QU3DCUaVahY+bMo1pMJ0eR/jCgY0awH4/sc0PubTnprjq3pfXViI6MCN3/+Vp8tToPP27Ox6ju2eFC5wjNCIziSW4blroWSE2j6My8rQUY3jkDvgi1PvrHiBDRMbAp/Sj8X83DmGxfjrucH2CwfQ9+n/Qhfu38Blh4EBh7NZCUErbdk99sRGqSA7ec3L/Ox2AYJvaFjmo5fbR9QyhtzeWIKh1t2tBO+MO0anHNMAwTa7DQYZohdc1TR0RHSV0z6VdjJCfNBaeNBIEtGNGhqFB0QofMCFTXNW17EjnEjDV5GNZV3wm8usYLj4l48DRCREfW6hgF0X8X7sIjX63HqO5toGqhSA8pxxiN0NHGY8N3vjGYUzMaZ9oX4Q7nh+htPwh88ydgwfPA8b8HuowKblNQXoN5c5eK29f2LQ7rgaShvb7DbdtDi/ZpzQd1OJKAdv1NxRTDME2DWaS8Svk+nBiI6CzyDUHbzLq/T4n0ZCduPqlfI46SYRim8WChwzRDRMcdXGaWx61OmM1spY1ObpTeJlPX1IhOdmqSaBoaqa5eRHRU17VAjc6gTpnYeEBrLOpWIj4yomMWvalPw1AZbaHaIxJIIYc0/WPJxqofL98rrlfuKcEARXepttDU++auD1YhI8WJR84eBk/gPhJLtB452lmhurv5YccXvmMws2Y8znfMw1/bfQ2U7gVm3KnbJhfAFzI78PXIx/ulmkX4ssVK9iSg03Cg21jYOo9GurucDiryjhmGaTBm3wjy+7CbLR/d7fnwwSHqc/qmRSd0GIZhYhkWOkyTCx05N6eTifY6zAhkjY4Vsg5HrlYuhY7TIfbdNs2Fw0qqnBESAeQCJ5Fpdd3apgWFztp9JVEJHSks6hPRIUHm8daGanQsIjppiq2rz28zjQxty6/AJyv2idsPnDFEN0aq00mxW+fXmzUerYUT73tPwhO3PAr78jeAZW8CNRXK8fpwsFQzeuiSnRqxwG9fcajfUddAI1cdNeVAdTGwf7m40BfRZBJdO54QwgddxwauxwCp+lTCWIGei45ZHJFi4jOis/VQmUgllkJngk1LW9uTOgiV1SnITuOaG4Zh4h8WOkyTCx2Jw8JgQDUjqCsnXKanSb1EqWjqPtqmmwsd+tEurfII0ZVfFoowFQdS11SRsGh7YVgOu7kZQf1rdEjACEOEwP6MKW3SPjrVFfpoqg+t2kvLtD0pbNRgCO1fTQk0ErEfj92F5KNvBOiisDu/HKc8/aO4vfrGqciKUHw86Z4Zwds77zw9fAUabPEuYO8v4uLbswT+vFVwVBUCW2ZrF0nugIDwGQN0Gwd0GAo4Wvar670lu3HPJ2vwf+cNx6/G92jRsTBMtMhv4Ap3LSY/85POTOBYp5a2tso5TFxHkwrMMAwT67DQYZoMmtRTTU6kHjrGiI553UeIdhnaj6/TkLqWHJjUq6lxI7tnY9UerU8MFdBTFIOai1KtieRwhVukgKnpauVubZ+S6jrMCOjM/qNfrceVE3thfO8c03HL54DGoW5rNBeQgsil2GsX1ZgLFLWIWL0dTZ1OJKFjdZ8qpMwiQvWCRG/bXtpl+AXwejyY9dXnOG10dzgPrAD2kQBaChTtBAo2a5dV72jbOlOBLqNDwodEUJuuRzYe7aAATwVAKXTuMqCmTLsO/l8O1FYDNgey1ufjMkcxMtatAZK6A3YnQBE0cXEqF4dYX7fM50dW1W4gfyPgSgltk5wVs9ErpnUgzzWpBjHyO1QaEfxcO1hcU3ScYRgm3mGhwzRpmgRFdeSPqlWfBTN7aSvaBVLXjK5rUiDJ9DNiUMfMoNCh++22pIDQCUV0yJjgYKk7GGExg9Yx76OjTfZnrzsgzAwqa7x1C51ApEYKEaNFtTcgfGickpIaJXVNURv0eMExGsYf0WLasB8j1s1DQ8ubosGoz54Ef9ejgF4TQgsrCoB9yzTRQ9Efuu0uBXYv0C6SzM6hlLeOQ4Fad0icCLFiuK37XxEyyjFGYjpdKKC1K3CpB7TZSXRjo8mdqW2BnD7ml7R25rZZDBMl8t1j/PhTfU5n5MPjd+C78l5iGaeuMQzTGmChwzQpqtCJJqJTV+pau3RjREemrmn7+O2k3nht/g5cNkGfTkT3p7ps2Fcc3idmQ16prreOEUszgoAokYJjR0GoniV8XRnRseuEiFEwSOFTEkipM6JGUqjnT1NEdKz6A6lPwRFHdKIlPRcYME27aA8MHN4SSHlbqkV+Dq4DyvKADV9qlyPFZgeSMwFXpnadnBH4PwNwpgB+H1btPoy8onL0auvCoA5pgN8L+GoBn7yWF5/hfy/8vlq4qyqQ7HLCpm5D0aKqIk3M0cUIjSent7kIyuzEIoiJukbHaIIy0b5OXK/290GhR/uO5dQ1hmFaAyx0mGaxmCacFiKmXhGdwI+vmesacefUAZjUrx1OHNhBpJNJKLXNmBbXNTtVCJ/1JHQMTmtRmREEjASkqNhTWCnqdsyOUwqLtEBER+7PqkZHbeKnogojeeyE6iSn7t8MStVTa33CH8NX5/JIEaEmhfowtR+oXUZfpi0jw4T9K0Ppboe3A640TZgIoRK4BP+n6yzr/5NS6xQNr7+3Ap8d2o/LevfAX84dXq9DqPV48M3MmZg+fTqSkpSz5nQchTuAoh1A4XblsgMo2aul0h1YrV2MUDqfED29w8VQVlctPY5p1dB3CaXidsi0Nsigt/Wh0mpU1eg/4zJtbaFvSHBZNqeuMQzTCmChwzQpZActsYzoKEXzddlLh6WuBeppUgIiJiPZiVMGdwxLlSORo46FoMagIaHjMxVglLZW6a417ZlDLmTG6Mzeoir0yk23jugE3NSCqWsWNTrSJMGIGklRzQhIjEUT0aFI0fR/zDONbNUV7VGXR4oINTuudKDXJO3STMjXvFGfBzqOTsO0ixFPtWbeYBRAdF28G6itAg6t0y5GHC6tFuo3X2sRMqZV8uAXa/G/xbvxxc3HYng3fS8wyZwNh/DJ8n3orfuO8iuNQkNCpy2nrjEM0wpgocM0m/OapeuaEmmhPjP1SV0L7sPEYUyNrND9mQaXsNE9skWDUJG6ZiIMMpKTUO1x6yIny++fgvs/Wyu2kyleqqjYcbjCVOjI2htpRiDNDYwTZfqfojNWNUNqJKW0yjp1zWr7D37ZE1HkREpdU8WeRdAnYZC24M0m+KixqoxkGfF6NLEjhY96IXHkrdHuo/ofptWy6UCZqL3ZcqjMUuhIa301zba77RC62grgtTmxzNc/uJzNCBiGaQ2w0GGaFLWgta6IDkVz1D4PdNOYIRWM6IQJnfBIkCqaKKJjtLumiA6xs6DCNN2MbFfJuECNnJCTnNyvTA9TRQXtCwOtxYPsj1MTSJWTyyn6RNEc+t8qmkOoGWkNiehEU8ZhZTSgTuqt0tsShSaJ6DQURxLQrq92MUL1P6X7gNL9nL7Wygn15vKFpapGQkZz9qcPQVVVKO2NrPoZhmHinch5QgxzhGSnhn4snRbRGlk7Y6zPMYsABe2l7f66IzpUz6HcbzxD2T0nTaSz0VzVTBikJzvCIidkliBFkYxwhAmdiK5rxtQ1v+45oNoZq/oceX80NTpWrmtqmqAVVv2BVHETqcanKaAo1MfL9kasPWpOpFBtsVqlaCFxk90D6HF0S4+EaWLk95Dxs1+XFj/artUy7m87Vrc8hyM6DMO0Ajiiw8RMRMeYtmYXQkf/K01ixeetDYvomPXfUYUV3Z+Tro/opDi1dDbVylmF6n3UyAkNn45BjlMKAn3qWmWUfXRk6pMvKMQqarxC+MiIDq1rjNSoEQRqgGopdCwiOsl11ECJ44qqRgfNyqnP/iTqsajY+rrjTSIXzYx8fmMiosMwynuSHCSpls8e+L6NHH31Y2JA6OTnjNN9X8qTMgzDMPEMR3SYJkWNolj10bGK6CgBGdx2cj88fNbQoFgKT10L/1FWhROltuWkJ+sfN8keTCUzg2p01Lx2OT5pge0JTHLVM6g7CqgXSyR7afOIjty3VxE6/TpkRG9GEKW9dF2udnIMkY4h0jpNhTSd+H7jIcQCIaHKQoeJrYjOsl1FGPnwbLw+f0ed79EetkPoYiuEB04U544OLuf6HIZhWgssdJgmpa0SRXGoysVEpERKXbtz6kBcdYzWyE6s66g7JUtNXaNePepYtGV2pAWiNmZkBFLXZJ8cKXDkfmUalUxjIvYVVZmKDGPqmtFeWoo9OvsqIzW5Ga4w5yO9GYFao2NsGOrFbe+uwL2frNEtt4qqqVilh6kmBXWlrjVVS5dYERYc0WFiDXnCZda6A+LEwMNfrq+zua9MW9vmGoij+nYVdYnEtKGacyXDMExCCp0XXngBvXr1QkpKCiZMmIAlS5ZYrvvJJ59g7NixyM7ORnp6OkaNGoW33nrrSMbMxBFqLwarrCk5yTc2C5WpF2akOayd26wjOqGxkKgi44O0CDUrGQY7aml9HSl1jeYUuwvD09dk+ogUOvLsq4wMyKaptJqs0aHnrn3AfCG0H/MaHWOK2/b8Cnyxaj/eXbJb1yMomtoaa3vp0HFGmjwRTdW60szmG4luRsAwEaK43gifGZm2tjl1FIZ0ycLKB6Zi82On4eGzTSzOGYZhEkHovP/++7jzzjvx4IMPYvny5Rg5ciSmTZuGQ4fMU0pycnJw3333YeHChVi9ejV+85vfiMs333zTGONnYhw1BcIqopMZiKqkB5pphta3ni6nOutnL01CQid0AvdJw4FIqWuSYEQn6LoWnrpmZUgQahjqMEyUfcE0OimIZOoaucS1z0yOKnXNbRA6qkGCOgGKZmJe2wipa6p7njrmIyVW3N6CEZ1YNyNIMOpzEo4oLi7GzTffjM6dOyM5ORkDBgzAzJkzEY9YNT22PikR6p+zPWN08Ds3mvRWhmGYeKHe32jPPPMMrr32WiFWhgwZgpdeeglpaWl47bXXTNc/8cQTce6552Lw4MHo27cvfve732HEiBH4+eefG2P8TIyjpl5ZTXjH9srBr4/phTumhHo4hMwIzElz1u26pkaIKKKjii45KUg1iCuz1LXg/gLNe4I1OoaIjpwg7DxcUWeNjtzW6LpGAkLWBGWR0Am4zEnkxJrGT81Mo7GXVtczTnrMnmKrPjqquKkzdc1kzI2B1diaG47oxB71PQlXU1ODKVOmYOfOnfjoo4+wadMmvPzyy+jatStaVUTH4j3a03YQnW2FcPudyMsY3sSjYxiGiQPXNfphWLZsGe69997gMrvdjsmTJ4uITV2Qn//3338vflD++te/NmzETFyRpTTpLA8UlBshgfDQWUPDlkcWOvXro0NCSBU+MhqTHtGMwCp1LRB9MTQM7dc+A+vzSnXN+MJrdJymNR4ydY2EiKwJIqEl7bQlpBnoc6SmrZmZEVTW1Jqe6TUKBTomY3NRq6iJmjZWd0QHunWjcLWOitixl2ahE2uoJ+EIOgk3Y8YMcRLunnvuCVuflhcWFmLBggVIStK+pygaFGvQ5/3md5aL79L/O3+E6TqURmv2VqTt1Fo+s7S1lf5+cKSENzlmGIZJOKFTUFAAr9eLjh31hYr0/8aNGy23KykpEWfJ3G43HA4HXnzxRXEmzQpajy6S0tJSce3xeMSlvshtGrJtPBHrx0k/uPUZm+qspm5Ht1MNE2cH/GH7tvlDk2KnLfx++j85EKWRURV10p+apBdaSXab2MYGGcmpFf9La+f+HdI1oZNfHvZYckKcZAuJI1rH7dEEiRQCtF55ICUt2WFDdkq4Qqh216CovEq3rNIgIsuUyU15VQ08GdpErsYwLuojlF+u79tDYzJ7ndRt6Xa0r2WVuwaOOr5qon3vklCLhfd3qOGr9jq2ps+pkXgYZ0NOwn3xxReYOHGiSF37/PPP0b59e1x66aW4++67xe9UrPwu0YmTmWsOiNsPnD4wrJaRqLA4iTRjdV6dRgSLfEPEd01Tvs7x9p5vKIlynIl0rHycsUu0Y22WPjqZmZlYuXIlysvLMWfOHJFe0KdPH5HWZsYTTzyBhx9+OGz57NmzRZpcQ/n222+RCMTecWpvs5JKd73y391ummxoYsO4nbFGZ9mShcjXfreDrC6kbbUJy4a1azDz4GrdW572mbebJg2BSI3NC7eSdLVhzWrYYIc/sKyivExssyVP2++uPfswc+YeFJVo4/QV7RXL1+89HDbeGo+2zvIlNOlyisjNVzNmYssu7fGL8im9xg53jQe79tOkxo4tG9ZCC6LoJ10zv56FfcLvIHQsu/bt12Wi7tyXF/x/ztwfsSlwwnZ1YOySFD9N3PSCbvGSX1C9Lfz08MqDoW0XLlqCoo0Rohm+0Gs365vZYRG4khrgg+12HNvJj8HZ/ijeu9oOyioqYqKGwh14PfMPFzZ4PLH3OTWnstK8N1Qs0ZCTcNu3bxcZBpdddpl4Dbdu3YqbbrpJ/HhS+lus/C7trQi9/2fMnBXmOElUeOr7cx6qz1nkG4yMXTswc+Y2NDXx8p4/UhLlOBPpWPk44/e3qV5CJzc3V5zpOnjwoG45/d+pUyfL7ejMWr9+/cRtcl3bsGGD+NGwEjp0Vo7EkHrmrHv37pg6dSqysrJQX+iHi148iiLJFIXWSKwe5+8WzhbXtX4bpk+fHvV2O9K247k5WzGuV1tMnz4u7DjJxED2VznlhOPRv6O+70zqpny8ummFuD1h7FHCMlWOhaCx7P5xO2bv2yr+b5eZjnLFMW3smKPw4a61opEn0b4djWM8ihbvxqc7N6J9x06YPn0U/rbhJ6C6GqdNGoMvd69EcY0Np512mq4g/87F34q8syknnYCn1swXy6ZMnYaV324B8najZ/euWFmYJzrZp2VlUhgUx4wbA7/Pi3e36S2iabtVe0uANb8El2W1zQWKCoP/p7fJoUprcXvchGMwuke2uH1g/k5g5+bgegO6d8Cejfm6/Y8aPRqnDQv/PBcu3g1s1yaNY8aOxQkD2lu+dnf/8h08gdqgk0+ZrDOCIG56ZyXWFh3C2iJgy6NT63zvytctKTkF06efgJaEom6+hdqPQZvsbEyfPqFVfE6tkJGL1obP50OHDh3wn//8R/yujRkzBvv27cOTTz5pKnRa6ndJfNZXLxa3T5kyRTQ5NnKwtBr45aeoH7u37QA62YpEfc5yX3/cNGgApp/YB01FvL3nG0qiHGciHSsfZ/z/NtVL6LhcLvFjQFGZc845J/hjQf/fcsstUe+HtlFTAIyQ+w1djNCTfyQvwJFuHy/E8nHWZ1y3nNwfY3u1w6ge2UhKCn+rtkkNCZ2M1OSwfae4Qv+np7rE/VQPJOsr6P/M1NAEPNMQJkp2JQk7aCl0aFvahpYTXr9N/F8TqF3JyUwJbWx3IilgMEA59jJ1LTMt9L722ynhzqar3aH1pHlAVloyXPbwqInd6YTfpk9fcRtqbypqFAMCaOMUj2nYrnN2atj+aR2z18mvRIxsdkfE11KtF7A5wtfdV1wdvK3eV9d7V9T7tPB726sYP1DNVEPHE8ufU5V4GGNDTsKR0xodm5qmRqY5Bw4cEKlw9HsXC79L6mfWbzP/3Plt9Us3kWlrK/z94YYL6SnN816Ml/f8kZIox5lIx8rHGXtEO856u67RGS1ypnnzzTdFZObGG29ERUVFsAD0yiuv1OVJU+SGVCKlCdD6Tz/9tOijc/nll9f3oZkEg+yhj+2fG2YKICFXskhmBNIGWnU1M5oPpCmua+ptglLhVTe3UMNQm65oXwondZxq0bxasC5d1+R2Zq5r0rQhLdmBgZ0ywo6P+mIYi+AjmhGormuGYv5OWYo4C65jZS8dvU01ibtI6za0iL+u/j3NgVrHFQvjYfQn4STyJBzV4ZgxadIkka5G60k2b94sBJBR5LQk0pwkUh8pK2tpK9S0NbW/F8MwTGuj3jU6F198MfLz8/HAAw+IM1+UijZr1qxgbvTu3btFqpqERBDlPe/duxepqakYNGgQ3n77bbEfJjFQoyiNiexJQyTXaS+t3d8rNx1Fu4tD+1AspGkdciGT1sHU90cVJlKMSBtpo710uoXQUSfDFOUhNziasNDjSOGhjl8KnXSXU4ivJ8bVYtrUKTjqLz+I5V+s3i9MBFSkIYJZcbLOdc0wMe9oInSsREhtPeyl1X2YCaf6WE7Xta/mpr59iZjmgU7CXXXVVaJB9fjx4/Hcc8+FnYQjUxw6+UbQSbrnn39etDy49dZbsWXLFjz++OO47bbbEEuoRiNWroNG58TI+IOOa2REQKQEXB8ZhmFaGw0yI6A0NatUtblz5+r+f+yxx8SFSVy6tEnBzsONX9CsNrYzjegoDUelSHnu4lH4w0erceMJfcPFktMuokDyBCptr57pDEV07KYNQ2lfVJZDc3i6jwTLnA0HcUzfXN2YaD8erxeeWn9YRIeQdrBybFTIr+bl3//ZWtFMVMXYR6fC7TXto2OcmHdqYxLRsZi8qx3WI7k8UzRH3cWRRnTUyV0s2EurDWIjHQcJohvfXoYJfXJw3fHa+41pOup7Eo7qa6hx9R133CF6u5EIItFDrmuxhBrRMTYnDi6vh9DpY8tDB1sx3P4krPBptbMc0WEYprXSLK5rTGLz4mVjcMs7y3HX1IGNul9VHMgeN3VFdHq2S8cH1080TVej/WnbeIN9fNR0tKDQCaTEUTSGLnKyS2NIsmsRIYqinPb3eSgod+P2yaFGqLRPEmg0eanxepU+OqGxyrmzGiGSXcvl+rKpqFHoyHVU4RMpomOaumbRR0fd1moddfxWj1nX9rGeKuZRIzoRIlOfrdiHORsPiQsLneahPifhCEprW7RoEWIZNQ3V0whCR6atkQkB1ecQauSaYRimNVHvGh2GqS9DumTh+9+fiNNHdG7U/comm4TqcBapRseIPqKjbypK2/fvEHJyk/dJUSXTzyTCrCDwmK/9vFOIHGLVnuKwiA5Ro4voOCKOjXBEaKAqa3TMGqCqQsEYgcgwpMBFW6MTKXXNeJ9pRKceKWjGeidfC4sd9TWPNJb8wOtfH+hYP1q2F/uK9X2SmMRFjehYfTbrk7o20b5OV59DJJtExBmGYVoD/O3GxC1W4sUsdU01FVDRRXSS7HAp4oiiI4M6h2xjXYHmolJA0aRUPZMqhE5gTF+s2qdbTpBOsdttQaFEE2Y54VfT8AgauvH4lKwby4mOmXGDWr9jPCNMx9iQGp1IGWTG7c32V5/IjHHMxjS95kZ9zSMdh9EgIhp+2HgIv/9wFR6fqZ11Zxjp+tg4qWuh/jkLA/U5BEd0GIZprbDQYVqt0FHnoNZCR1+jI4WKjKAMVoWOoUaHJrlygkF6QY3WlFWH0k1Kq2p1wkuOW3Nd85kKnXSXMyxKFSmiEzweE6Gjuq4ZRYfZPj0WaWVqFCZSJCOqiE59hE6t3/IMd0ugnj2P9Dw0ZJxFlTXiujhwzTA6MwILQWMlgIz0te1He1sJqv1JWOUPpVPmZoTbZjMMw7QGuEaHabVCR03zsFo3XYnoUP2MGgWiaEef9unB/0sD4kVGdijSICe9JFRImEgxpE6Gy9weXfREiiHaXkYE6HHVGhzVDU4dT10Y63qI6gg1OqYRncDzRpP4wsqa4CRIF9GJmLpWdz1OfSI6VMt0pJGSxsTKUU+FareqPKEJarTI/cWCuxwTG1TqIrL+I4roSLc1WZ/zr8uOEjb+3XPSGmm0DMMwsQVHdJi4pX/HUP2MGe0zQ2cp1dobFdVtSDSjNNToqKlt2/LL9REdpUYnGO1RUt8kMrojt5PRG5qcSGFDj6uKjnRDT5+ohY5ZjY4a0TFMlCiVTq1DIjyBMd398WqMfew7LNx2WNtWZ0bgP6LUtfpEdKiWSaXSREDsKKjAvZ+swe4mcPcLH0/kWqWZa/Iw9MFv8PGyUPpitEiBEwumC0w82UtHJ/6NaWsju2djyhDNlY5hGKY1whEdJm658KiuyCutwSTFvtkodN65ZoJpOpdETRmjybf6vzGtiyI+VjU6roCZgJmgknbRoYiOLRj1kRNbuk99vKaK6BjT0ugx37p6Aj5atgebDpbjy1X74Q2s8+GyveL62W83Y2LfiXozgkipa4b7jtR1zTi5M0sJu+q1JdhdWImF2wow9w8noSVrdOZtKahnXxOTiA4LHca0YeiR1Oj4McHQP6euqDjDMEy8w99yTNxCKRd3nzoIx/Y3FzrEMf1yMap7dlT7o8mlKlSksPjfNRPEmc/Hzhkm/pfr0PpyQisnDKZCp9pYo+MInoWVkQ26T02bUyNJdaWt1BXRoZ46e4sqzWt07DbRS+eWk/ujYyACZpxkF1S4w9KpvM1Zo2OY3J334gK8MX+HbhmJHKIx+zWt3luMS19ehDV7S+rVR+dQaXWDH1OKTHl9pPyysxCv/bwDS3YUNsr+mJYWOg13Xetn24f2tlJdfY5Zo2Xm/9s7Dyg5qiv938k5aqQZ5YAiQlkICRFkSyAkjMFgg7GWZAyLjYy92KyMWSOSDSaZs6wW+MNivDY2eH0INpYxQkhEkYOQhAAJoZzD5Dz1P/d13+pXr6uqw4xmpru/3znSdKiuqtdd3fW+uvd+FwCQTEDoAKBFIiTaoqeazR5ZQc9ePZuOG1jirLFp0yM6Yj3t7WImwqkgGK3hCYxEWFRER3utm2CJpjbFLXr19Ac76aRfr6I3Nh8IEzESpVLjFQFnTKYO1DaHTer97KXN+p3Op66FT+Ju+lvgyvTRZNEjb9Ebmw/SBf9vjafwcots7a0NFzrRWmLLRLaranS4h88tz22gf6zb3SXrA91PfTR9dKIwI5C0tXc7RlMLBRoO5yKiAwBIcvArB4BHRMfLzlkiLyxSbKETfJ1XLZD+Okkvq29uC0V0MtKoSOtp4yZYopnMuAkk4U9vbw+r0dGjSHLbFCESkXLaS/ulrjnvuy0bS2ZWtI5SXY3UVpmpcpEamO6pDu+fE20qWnsXp66JODZ7MoHEQb/A4fVd0OvwvJhppK3xxRW5uAEAAMkKanQACMLpQg4zAg+lY6euKTOCdkfDPTczAkEiNpKWxhNouXLP2zqmbyFtP9QYUbDEWqMjFOZk0P7gpGnRCUPoollDlRmBvX/B2171M/rjbhPxfbVNqubHjOh0dtIeTcped+JnRsBX3A8GU/3iiWDJexVLxMuPhmA0wC0VEqRSRCe8fw7qcwAAqQB+6UDKM6aySP09e8rAMHtpNyS9TdXotMYS0Um3BUdYRCc9jUb2DbmfxTsxLfB5HTcTFbHCdUtjq4rdxxUUFubw9XQqMxWLm5LO+OVKmnbbi2G9Pjpbb+I2uetTkO24r39uRxs/M4IDdc3kltUXrfkC21L7TWhjRZpNIqKTuDQ0a/bwcdpLj0rbSRVpNdRoZdPaYH2OV28xAABIJiB0QMrz1A9OpL9fcxLNGd3XEZHxEjp6uoekNYVqdLy/UrI6ETF8pVYmwLytYzSbZ6njiYTZaFRPf3OL9uipciYZWiNUpo/WRLC2qdURZTCjNofqQw0ud1c3dWlEx20SZ17BNt+Ho4m+bX4bLO292FsTHs2JJULT3sURHaSupYbrWiR7aUlb4/qc1mAiByI6AIBUAL90IOVhATB+QIlq+KkX50eK6OhpJTLR9ovocEQlsD2J6LSHGoZmpNHIfrFHdMzJSkleoMjYDZ7shuys0z3HJZNsXbTtrWlyCBa3iI6wPejwJnR20u6WllPX3OYQGNEKHd7va//8Id3w9McRl/WKEoVHrHSh4+64Fq3Y62p7aUldy0PqWkLCx2uj9t3ySlGLFNGRRqGStmb2EAMAgGQFQgcADRY7kSa6upjhCbcjdc2YcOtCpCIYIdHNCHThoaeuRUuekX5S7CN0eI6kp8qZiLCTq8Z6uhUX2PtFdPSrzjsOB+qMhM46iMn+DCnPp5ODVuK8eX2bfgLTdCF76v2d9Phb26imKdDfyAuveitzsqmLEi9r6ahrdOS976LUNXmP4q35Aj2LLnKYVqN5bjRCJ4066IRgfY4YEfQryqFrvjqqS/cVAAB6IxA6AGjo83/P1DXtccmftyM62nN8syg3JDz6FAbqSgo0MwJdeJRpdSdekQETM8+eRZTR59QhGPRUOa9x2c5fmkDZU9PkSJsx5+Ei+JgdwZ429rI+VtTRIBGUiYNK6H+/O8P+jPRtuqUMspDZZvTVefKdbaF9DrqqeZHlYUZhTio7okhd67mITuD4xNX7xDciiNeMgOtz+qTVUoOVQx9bI9Rj95w/ic6ZMrCL9xYAAHofEDoAaLBrWCShw1EfEQV+qWv8mF5rY0Z0eKKup67pSM+eSOQG3d70+151QgGhY4Wl34X10Qkuo0+qWHg5IjpGcb2kSEWTuhZtT5nQfodS6fi9lxRAsX/2Sl2bfcdLdMpdq2h7UHjtqW6ilzbus5/XhZIbenROT5MzmzPqosRLoHb0eI0OUtcS3YiAkb5bsdhLz3Kpz/H6bQMAgGQDQgcAj9Q1XfSYiDDh9DMmJzMgaLIyQ6/hibmeWibF/ZJGxOJABIMIp9U/nUO/Pm8CnRvl1VYzdS03M8OzXoUFg1+Njm0vHRQ47UZKlrOPDikBcdtzG2h3daOqN/JMXTMm7bH2xZHlRURKlEwXKrpwe+TVL+jNLw7aQuj9bYfV3/e2Hnb072GDBT/0yJ0ubsyr6rqI2V/XuYhOVzcMDdlLI6KTiJg9nMzUteqGVvV99ftOmf1zIv22AQBAMoHLfABo6Bc69R4zJjzpbmrtsO17c1wjOhmOvjYVwdQ1aQaqzAgM4TGsokD9i5YcU+hkZah9qXVZlifofjU68pgd0TEm8Lrw4XStS3/7Nm3eX09vbjlIF80c6um61m5MwsxJGUdL/vzuDnpuczrNbeugrCz3VDERkRLR0VPPdHF3298D9QjCwboW+vETH4RtV48IuaG/R7yspAmaqWv6+1LT6C6eorXYluWitaOOBOylExs9UmqK7C/219FX73mZTj+2MizK6F6fM85+HBEdAECqAKEDgEa0EwBJD5PJtpu9dHZGmmOCKalrdh8dZS/tLTzicV3zS11ri1SjE3xdqEYnNHnaX9ts1OhYSuQw63bWUJ2RYuMXzTDTbPjpG57lq87p9OjrX9I188Y4npftZmcE3rfCoIV2XXNrVGYEtzwXuKJtEil1rUWLqnDkrm9R4PMzBZMudEQ88WegLxdrjQ7/4UiRn9iOBO+XiDKkriUmpqjWv4P/9dIm9feFDXtVXyw3xqTtoPK0Oqq3cmhtsD6H6cxxBQAAiQRS1wDQiDajQ67ui3OXiAu91obFj5vQkUkn59/79bUxufa00ZFT17K8U9d44t7uV6Njp65ZapKtz81Z6Pi6rvmIBrPexE8o/OX9nWGvl8ldWERHE1ex+B2U5gdT3yJEdJo1xytdFIVFdKxwoXP3+ZNoYGme/Xi0qWj6cp01JNCjAYjoJCZ6VNX87mzYXWPfloiO6a4X6p8zhtq065rd2WAXAAB6EggdADxqdKIxAeAcee/UtXSVvhbmuhacqPOkRSYu0USSrpk7StXwOPfDObHh/fASOhyhaY2mRqcjZFog7DOFjjFxlxQpN178ZC99eSAQ/YmU+rXtUKOj+ai+vIhJO6Kj1dj4pXqZk7/pQ8ujSl3T04F0oWPW6OjiROp+Jg4sodd/9lVb7ERtL+2og+qs0Al8JvyxojlkYmLajMv3l9m4J5Sg2hJsGKq7PDIzDVtpQe8XBgAAyQzOfgBoRFukK3a9hxpaHPd1ocO39ahAWb7YS4dfXc/0sDI2MUWMHtHhySwLNW8zAv8aHb1hqCkceNKs953hKIa+HbOWQOedLw/TnLtXe3Zx53XpEaZXP9/vmkIm721hMCKmiw+/iEmTIayqSgKRtVqfKBRHtPSr53r0p9nDXprfNxF8RUExJpG6aKMzei1PZ+t0ROhwBDFaAQ96F7qw0YWP2a9JjlW5CGDW5+iNQhnU6AAAUgUIHQA0oj3/s7sZUx0sPheh46jRyUx3NPyTyQXXwphX2KOdeJgpbrq9tER3PO2llYCRiI5bw9B0e3KlT7BEFB2oa3EIAV1k6a5rkQiL6BjbM3vf2KlrRkRHFyp+0Q/9OTZNKMyJnLpmptf5pa69+Mk+2ry/zrE+ubIu73M8EZ3OOq+J+EQPncTFPG7kuyBOgqaNuAhsZmzadipLq6M6K5fWWcMcy0PoAABSBQgdADSivfItk0cpz5BJv6NGJyPdtp820d3YvGpmomliqaeuiejxjOi0dYTZWTvXHZqU6xOs/qW5YctyFMYpdPzTwHRModBkRHjMPjy2GUFwXG6ua9EIiStOHk43nDnOngz62UubhgkOoWOIoFuf20A//OMHdsRLTx8MOdl1HPUaHRY2p937Mt347Dqjhw6ETqJiHjcS3eSeUDqHgym0c0b3syPGXvU5DIQOACBVgNABII7cdembI8ik36zRafRo5GdOPqOdeOhNLNV+OIROMKKj7dud502ksyYNCDUMDU6UxGHNbR+4KaGkyPDbUVnkInQ4oqON4XAwhS8uoaNFvdz68IRqdAL7J0Jl++FGW6xEIwrGVhWr90he7+e6ZqbX+UV0mIP1zbbQ0eskJEoWfUTH6WwXC1yz8fm+Olr+8R7DWhqOa8mSusYXK/wMPc4/fhCtvWm+OsalUaiZtsagjw4AIFWA0AFAI9oLnWY6UK5b6lpGOv3wqyPVbbMBqEQlYq3RMSMxjtS1zPB9GNu/iL46tq8tBvzsrEU0cTRD3J44gtSvOFDTYk6s9PS7XdVOceKGNNY0a1z09D43oROWuhZ87175bD8t/M9XwyJQXoRFhHyEDvdI0qn3MSMIPGbZ5gbFWvqQ2ZvI5O0th+itLw7a9/Xl3LbjR1NQ2DQGU9bkLyI6yWRGEBQ6Hn1zWNTyBYvMNItmpG8M658jIKIDAEgVcKkPAI1o+0vkGpGVfInoBC2QZWK9cEJ/euW6r9DAsjzn8sbkM9p5h9kvRsSNLnp0AcLLy2t4ciSCwG2iI/vEwkNc1TgVr2/QFjusR4s2Cdt1xJlK4wYLHBaIYULHcGzbdaRRrV/2McyMQBMS2w81qv2NJjVMhI5EXGqaoo/o6A5tbpNMvtIuy+h1EnaNjku9DUeyzn9ojbq94Zb5apLqcLaLOXUtsM8Nre2qCWvIjABCJ1GxLzhkpAVq54L3vYVO4LMel76NSq16qrXyaJ01PGw59NEBAKQKiOgAEEfqmhnRcXNdk4n1kD75YcJCr9Hhq/7R1gbxevRF9f2QiIxeo8MTJNmnQETHu0ZH0u+41qNVW04aZZpOY3odi0zK3RzlzBQ1M+1GoicZaQH3Nd7PvZqrlKTryLgKjFQsnvRFU7gfXuPjU6NjTCQjpa7xmGpdUtf8Ijr6OkWUtHaiRkciY1w3xvsv6zR7LYHeBwvTHz/xgV1fZUZ05DOU74J5fEokV77rx1vr1d93OsZQO4V//khdAwCkChA6AGh4FfKbmJNH24xAS0Ezoy86BdpkPZpmoTr6eiO5rgUiOsHISFuH3QTUrUZHRBMLD0mR4eWk0akOCxu3yVZp0ELbayLOEzrdcjuwvcD97HSi/iW5YelrIoxk3NLwU4++mKLgHz86mRYcV+V4LCf4+nhqdPTUNVOoMfx++UZ0XESLLmrk+c7YS+uRMRY54rpmGl+A3gc35H3mw130v2u2OlIW5biQ76Y85/bdy88J/ia1t9JC62V18y2XtDUGqWsAgFQBQgcAje/OHkbDKwrs2hovdBMApxGAM3XNC3tSEkN9jumOZqau5QVFj54+x0JFBIKb1bVjn7RojDiacUTCTbzwHN0UA24iROdHT3xAp961mo4EHaIE2S/ezUHBBps7NOe1kOtaYJ8nDy6lX3wtVGCtp+QJYyqLVCTNPXVNXNd8hI5RoyPREdkeo18U582L1bgudEJ9dDp8hYmsszP20novI75tR3SQutbr0Rvu6uYcIobFUMKu0XER25I+Sy//msZYW+iIVUBPt5/kuj0IHQBAqoBLfQBo8KR+1U/nxBzRyXdLXfOJ6BRpV9ljnXQEojHtLvbSEtEJPcbRHBFS+sTaLXVNF00iAng85QUuQqejw/WqsjRF9Wocyvxt7S7H47JfrGMG2EJHi+gEtyPvLaf5XX7ScPqvlz5Xtroqdc0QElyDIBEcr9Q1FgJ6LZCf5bU0BVX7o6UT6QLoUH1LTK5ruvCU91IXN7HW6OgOfzxZtu2lkbrW69FFKh8XcgyFpa4Fjw+39Ml8Pq63riF69R51/+etl9M+KnPdHlLXAACpAiI6AMSBnjIWqUbHjRJNELiJDj/0njs5bq5rmU6xJZEQPQLjNrlncSDjEqtkXq7MJUrDE3K3yVaJT0QnUh8dHlbfosD7crCuOTyi4yFcWCS4iQLz/beFjhZx8UpfMyM6ejqR7L8pdg8GhU5xlDU6+pV7Wac+jthT15w1P/VwXUsYdMGsH3utMaSu9clsJnr6SiKrg/6Z+RVa3jHTc3sxBpEBACBhwc8dAHFgTnJFZEQb0SnNy4o/oqPNUvIiNAzl6E+0ER19feJIxqlXbqlrTS4TLV5nYRQ9W0xRYkd00kPvizRA1K9ih/UQCr7nPOlzExJmjZR8Hvw6ue3VNNScSMo+8xV22ZQeTWMO1TfHVKOjR2AkSqSLm1hT1/QIUaBGJxjRQY1Or0evAdM/R4noiFgN2UuHp43+oPEhoiPbiEqH0LK8f/XdXqzpsgAAkKjg1w6AONAnuWznLHaterTFL6JTVpAVlWmBG3oNjlvqWo6H61qkGh29FkAEAPfRcau70aMH+nijMXMw+8NIZIOHJds6Eqx3cTYM9YjoKJOD0OMyfq+ITjR1Omb9kQgp3UDArH05WCepa5lxR3Q6k7qmRwVYPNqpa4jo9Hr0ixD6bTluIqWunZn+Jp3a+CJRWjrRuQ9Tc3qB7/agcwAAqQJ+7gCIA11g6BPeaFPXSvOy447osPhw2w8pfHe4rqWHXNdsxzUfO2uJCokA4H1zE2L6pFp/LBqhU9fc7mEvTVQSjOhUNwREgy7QzAiKjFMv5P7p6aPphX87JTB2D2EUjfOaRHREJIjo0CeYZlTPvUZH+ui4mBG4CR29YWic9tLyWazfVaNu9y9x9nACiWNGIMJXfmMk8id/WdRX0UH6Zdb/BF5w8k+IhsyM2CcHNToAgFQBQgeAONDFjV7srU+u/SI1epQk1hod3Y5arxWSdBSZ0PMkmyc85n74CSuJ6NQEIyoiksyaJLnqzBOthy6appb7ypi+jm2NrSqi44eFF0NXN7Y41yURnfSQmYGeuibPmxEUqU/SC7kvP2kEDe0TuJptiq4czaShOCioZJwmMtmU90MmnM3tgcd5nqhHznShUxx1REdPXQus19kwNH576XW7qmnboQYlBk88pk9M6wHdjx4hdaSudbinrkkdT2luBt2T9SCVptXT9rxxRKcuieo3Ba5rAIBUAUIHgDjI1Sa5udoEPDvaiI5W99KZGh3dKU0mN7JduW/WtvhNgiRKIREd6bejRykYKXTnyf788VW05vq59NBF0ylbE2GDy/Pp/646kc4Y7+xno6d/Oeyl0yw7onMkGNHhib9X8b+813p0SX8vTSGifx5iGCCmCyYykSwI2oDLhFNPozM/NxEzet8aP9c1t9Q1Pa2vMzU6f1+7W/09YUQ5+ugkgb20RDM5RVN9J4LHyXczltPsjPXUYOXQM8OXEmUEjmu/iA6L9GgbFAMAQKIDoQNAHOjRBX0CrtfPmPbGOrqTWWzTWWcdkDN1LRjRMf7qfXf05fzGJTU6Ior0uhM9GiH9hLipqFmjI+kxkfq4NDnMCIIRpaY2VYitT/rChE5muNDRRZxf6lqxbKcxUupapmuNjpvQcf1MfCI6bvbSTte1+Gt0OJrDfGVMv5jWAXqGBi2FUo/0mWYEIoZZGI9L20rfbf69euzWtn+hppLh9jJ+PYhjjSADAEAiA6EDQGdrdBwT23RX0WOiWxBLc85o0SfwpvGAI6ITvG9O+GOL6ASFjkdUwIya6NsSIWCmvZnYqWtajY6IHV0MmNuS+zJJZF2lX8nONvZFFyYlEVLXxIygMMe9RoffYy+ho+9nRvD9iyaiY1mWs2Go8RpO0bv7n5/S+9sC/Yj81iccP6zcdVnQu3AYSThS15wNQxmO5litjXRf1jLKojZa0T6N/tT+VccyflHidERzAAApBIQOAHGgi5s8r9Q1rSbERJ+QexXEeyHiQ2pwzMmNCB0RHXpNj76cG3Ll2BY6QeEmNS2xCB2ZT5kmAl4TdH4pR5tEVHH6mjzHYslMxxF76Qa7xsf5vJ6yZzq2RUxdCwoaSfuSNLJohI7D3ts3ouO0lzbFkFmjs2zVJvqvVZvovAfeoDc2H4jKIKJfcY7rPoLem7qm11pJKqP+HWpt66DLm/6XxqTvoJqMclrSegV/2xxRH7/vOOpzAACpBIQOAHGgN+r0Sl2LxoEsHqFjCxiPlDRT6MQU0TFS1yRKZKauCdlajZC+bWdEx1/ohGp0nE1H2ZBAhI6ZtqZvSyaG5gTOr15KhFt1Y4QaneBVcjuiEzQNUEInLYqIjt1HpyNiRMcUQ3ot0+H6Fnrs9S/tOo1b/rYhbH36BFkQcwfQu9ENNaSBrn7cce2bHEtpX6yi89ufU7f/OuwGOkTF6nZBlBEdOK4BAFIJCB0AujCi43RdOzoTCttkwEPASG2QbD/Mdc1nv8yGoTJhKsqJLqLjSBeTGp2IQicgAkQjyuSc3dkaW9yNCPRtSbNFswmiLm7ChE6uf42OTDblKrmYEUikh99Tz9S1OGp0WOiER3RC9//87nZ11V+2eaCumT7ZXWObDpjrk/S8aMU26Fn0aJzUrOlily9i8Pe5jGqo5Pkfqsd+13Ya7asKWKkz+cE0y0jpaX7ffwAASDZwFgSgS2t0Yo/oxIpEbsyJtmx7dFWRmshPG1oeSnFLc+/DYyITe4kyybYKPSI6YalrWkQrPUKNjqSoccPPwP47rbcP17eGeui4GBqE7KWDrzcmcM40QveITmTXtdjNCJwRnaDrmouDWlNQxNkRHWMZXRztrm5Sf08bV2kv/7X7X6Or//g+vbB+j2tEp08hojmJGNFxs5fm7zYLnduz/ocyGvbRJmsg3d72HSrVUkqjTl1DRAcAkELAdxSAOOAr+jz54MmoLnrYtpUnJDwhNkVAV2G7qRkTe7GsZge0d/5jnmNyz4JF6kv8JkGmoBDHNl5npOhFYN/0q8rkG9FhsVHbHDIcEI0k4zjS2EoVfqlrtr20RHQMoaO9/+ZnEblGxxnRaXep0XGz8OWH9P2IOqLTzqlrzvQ2cdzSxygikI8vifj86e1tNG9cZVhEx+szA708ouNwXbPs35tvZ75CZ9A71GJl0I9arqYmynGYdzjMCHzETKRmogAAkEwgogNAnMjkW7+SqqeK+ZkRMIVx9jeRyIWkai0961g6d+pAmju2n6NQX++VYTqQeaE3Pw0sG3jdRbOG0oSBJXT6sYGIgrcZQbg5gimGBKn7CdXYBB6Xq9TVDZy6FrlGRyaJ5rj0fQmv0YmQuhacbEokS4SKLnTcap3M91326bE3vqTvPPymoy6nKYbUNRmjTGyljwrz1pZDdkqdTgUiOglDQ7O765qYERQ3bqMl1m/V7Xvazqf11rDA41FEdL41bRBdN38M9SsKCF9EdAAAqQQiOgDECU/gOSJhTsIDQqfd115ahE6sRgS6wBHBc9nsUP8ML/RJv5nipWP2vJHX8b7+7Ycn0Wd7a+mFDXt9UtfSw+oE8iIInaawiI6LGYFb6lrQCMGOCMVQo2PbS3tEdKRGR8RomBkBp665TBh1k4rAPoWWeWPzQVq3s5omDSxy7HdgvR3UaggdPQokgk+MGkwRtKu6MWxf+hQgopMoSANeN3vpDGqnqe8uocz2BtqUP5kePnSm/bxnREc77s44rormjqukP7y5New5AABIdhDRASBO8rLTXSfhHF2ZNrSMRlQU+r6eJyBMVXFuTNv1MhnwQ28SKlEaN/K0yVLgdc5JkVnkbAoIvUmqLOvluiYiQqInmemWI3XtMEd0gpM+ETVu2xYzAl/XNS976cZW1b/GRPapIPh+tAbTylrbLF97aVP4mYXfDhth3V6aIzpmjY4WtZGJcGleKEqjfxSrNu4L2xfU6CQOjR5mBCx0fpj5NJUe+ogop4SeGfYL6tBO27rQKdDNCLRjU27L9xFCBwCQSiCiA0Cc5AYn3+ZEfulZ46N6/ZIzxtLwigKaO65f3H10okWf6EvdjRtm9MWMkpjbNAWIHtGRZd0iOpxmI4JL0rBEE/QvCQi/Lw/W09QhZZ4RHdNe2q9Gx8temgMjLD7MNEKJJIkZAWuhjg6LmoP76mVGYG7H3CdpbqpvQ70HbRzRcaafPfLaFnVsfe/kEaGIjjax1fXZFwfqw/alD2p0ej38Ga7fVUMH61tc7aVHNq2nxRnPBO587V7q2DmIiDbbx5aerpaf5V6jI7flqwyhAwBIJRDRASBOZPIdyT7Z7/WXnDiMBpXld0kfHT/0yEw0DUPt1xnLmulafg1D7dS1YOTL3E74ugN/Jw4qUX837q5VTUPVOlyc2+yIjpfrmo/Q4f0W8cdRHbFsFhMCESF6/yC+uh7JjMAUfmb0TI/oOISOS8PQIw2tdNvfP6HqhtawGh2TfTUBVzadigJEdHo7Hx1Ko3MeeNM9utNcSz+pv4cy0zpo37CziSZ80+F+yMegCHH+qukXA9wMMWzBA50DAEghENEBIE76Bq+Y9w0W+XYXXo1Ao3lNpBodMzqlp7wxZtabWZOiR45kQuWWdsb1BOH22IG/A0vzVCH9gboWem/bYU8xKSJLHMlMUeHsaeR8jg0D2JCAt8F1Oi0HOmjO3avp5FEV9PvLTwiL6DDtmtAR1z2vfQqNyUhdc0R0/O2l7efaO2yhwxNdcfvT2RMUOmzlLetFRKf38+qe8GPITml8/mc0oGMP7bAqaM/Mm4njvkXBlEsROuUF2fS9k4ar41QX866payJ4oHQAAClEXBGdZcuW0bBhwyg3N5dOOOEEevvttz2Xffjhh+nkk0+msrIy9W/evHm+ywOQKNz09fF07/mTaPbIim7drkye/QSL12si1eiEO8ilxZS6lq0ZMNipay5pZ7wdMyIiL2URMnlwqbr95heHvPvoBCd2dlNFl75CEoBy62kkdTocMXn09S3q9qufH3C6rml1D5xaJi5YKqKTFkWNjil0PIrOldAxUtfs7Sqh02a/b24Cd29Nc5gBQXmBe/QH9B76upTnqb5SG/5K9MEfqIPS6NqW71NaXqmj95R+rP3H146lfztttGfk1Yzo+H3/AQAg2Yj5F+/JJ5+ka6+9lpYuXUrvv/8+TZo0iebPn0/79oUXwzKrV6+mCy+8kFatWkVr1qyhwYMH0+mnn047d+7siv0HoMcYXJ5P504d1O1XSCXK4tf400Sf6MdSo2OOLVzo+KSuib20i8jgK9BhqWvaYpMGBSZ2ks7l10fHa98CPY3Sw0wSwpuGttEnu2vsx9mcQOokHBGd9lBEJ8dT6Pin/omNMA9Lt4QO9NFxj+jwchLR4ffBFJ/M/trmMEvpcriu9XqC3hYOClr2E/3tGnX79xnfoLetcfZnrqdS+jUk9jcj6Lr9BwCA3k7MP3n33nsvXXHFFXTZZZfRscceSw8++CDl5+fTo48+6rr8448/Tj/4wQ9o8uTJNHbsWHrkkUeoo6ODVq5c2RX7D0DKkdXJiI5fw0CvnkDR1ujok69QTUCae0THeFx3454YjOgIrqlrPlbO9jLS08hlUiiTRq7R2bCrxiE6pNBft+xVNTpaRKfDxa3N3CdTfImduJa1ZosZs0ZHr9kQUcTvm98Elx3rfnPBJLrrmxNVWhPo3dQb7uZp1EE/b/lPosbDRP0n0UNp5ztMQXTTDFPo6+hPhcwInJEdAABIBWKq0WlpaaH33nuPrr/+evux9PR0lY7G0ZpoaGhooNbWViovL/dcprm5Wf0TamoCkxB+Hf+LFXlNPK9NJDDO1BhrelpgQszzlmjfA10ElOdner4uO2jxrE+89GU7gn1k7PWmWY7n0zpCz/MFDX6uIj+DTjymXImiVZ8GUsNyVUTEuS3WbbKugSXOSTrrL3Of08n5erf3Q/Uyag7U/5jP5QdFyfZD9Q6TgOr6UGF/JnXYNTFNLdzANFgPlMbRnTZXEep4PyynoqlrCvyGhQmd1nZqanb/TA7WNjo+H7/aLP5sv3ZcZZd+P1Lhe9ZTNLQ5RcelGf+kWbSWKDOP6NxHqOlB7n3TYl/UcNboeJug6G6JIrblsPG70AEAACktdA4cOEDt7e1UWensjs73N27cGNU6lixZQgMGDFDiyIvbb7+dbr755rDHX3jhBRU9ipcVK1ZQKoBxJvdYP9/FE5UMOnRgPy1fvjyq1x85zLOcoEvZvm20fHmgeaAJByky0zKozQpMhj7buJGW13xiP9/Y5vzZ+PST9bT84Dr7foP2/OebNtHyls/U7QuCDtqvpWdQa0caHdm/h+rV7mgmCemhcQZ0R2g7nxnbYTbXOJc5cvhg2PvR3sqTwTTasW0rLV8eqMMRDu8PvCfPvfOZYz+e/ceLar1pZNGKfz5PaRRYx4srX6LNOwOv+XLzJjrSwu+RU3Qc3LfHsQ8fHwh8VsKmrdvpj3/dGuZ8deDQEXrjzbccywovvR54nPdn5Qv/pNamwP64Ub1vJy1fvp26Er44BY4OdZpW/unkNrrikyfU7Y7Tb6P0vqOptX2L40KFnrrmlhIq6NFSW+gEH4vFrREAABKdbnVdu+OOO+iJJ55QdTtsZOAFR4y4DkiP6EhtT3FxcVxXJHkCddppp1FWVvIW6GKcqTHWQ29to2e2bqSB/ato4cLJUa3nqYPv02fVgWjKaTOn0MIJgWalbty+/mXaG6z5mHjceFo4c4jDNexn77xk3z9+6mRaOLG/fZ/dyq5/J5CWOmz4CFo431kkfdNHq+hwQyuNGhFY5xv7dtjPcfBFH+ev1gWWZU6YFr7PH+2opv9czyIgQFW/vrRw4TTHMndvfJWqWxpp7KhjaOFpoxzPvfvcJ/T2/u10sI1rWUJRi0nHn0j04duqeeqZZ86nGz5YSa3N7XTyKXPo45e/INq7i8aPG0tbDtYT7dvlWOewIYNo4cLj7Ptp6/bQ7z5fa9//8GC6+jetwhnSyS0opGnTRxN98gGZjBg7geizDSqNjvfn/s2v04H94X1zmOMnjKWFJw2jrkQi6okAG+XcddddtGfPHlU/ev/999OMGTNcl33sscdUCrZOTk4ONTWFW3UfLYKHN734wxk0/JmvU0ZaK61sn0InTrqU8lTT2EDUUqJ4utDxqw3Ug34ibMxaHQAASAViEjoVFRWUkZFBe/fudTzO96uqvCdOzN13362EzosvvkgTJ070XZZPNvzPhCdAnZnYdvb1iQLGmdxjPWVMJY19dyd9ffLAqMevF8kP71fk+7qygmxb6ORkZzqWzTUiGFWl+Y7n0zNCPykWpYVth2ttDlMrFeVmO4rxmQxOy9LGWVmcawudwtzssHUV5DrT27IyMsKWkXqWXGMcTFFe4PWyDaG2pcO22ubXBNKA2nlwJLucl5NFVjDq5RifsZ1sj/f5vQPO95Gd46w091SkmqCBQX5OYN36Z8lX9fX3sbIkr8u/E4nyHROjHK4bZTfQ++67TxnlfPrpp9Svn3tTXr5wxs/rBhbdRVt7BzUGMyYHvn83ZezfQAesYlrSeiWtaOugvByuCwt8tpK6pptjiDFG7GYEEDoAgNQhJjOC7OxsmjZtmsNIQIwFZs2a5fm6O++8k2699VZ6/vnnafr06Z3bYwBSnGP6FtLzPz6Fzpo0IOrX6IXuQ8r90z/L8kMCwnR2MydJLEa8nm93KdYXm+i8CGYETFVJaN1uFtVmUb7bBE7qGNwK+PVJo44IH64jUvsVXK/eR4fX5+aSFsl1zQteb7uHvbQ0TRWjiCxtLBVGrxzzfioRq1GOCBu+SCf/zLTso0l1U5u6GDA7/WPKe+9B9djP2/+VDlCJsh5n97+QdXp47yxpbuuGX8NQCB0AQCoRc+oaXzG75JJLlGDhlAC+alZfX2+nAFx88cU0cOBAVWfD/PrXv6Ybb7yR/vjHP6reO5xSwBQWFqp/AICjjzSUZEqCtspe6G5dYfbSaf5CR6fDRQjkBoVAQXambZksmFqkvyZ0zEambq5Tbi50InDcHKpMhzlTWMg25T3gq+u261pGmqtLWpjrWgRnvNL8LDrS0OprLy3CS5zneNu6Rfa+2iZ7QtxHs5dOJeI1yqmrq6OhQ4eqC3ZTp06lX/3qVzR+/PhuMck5UNNAJVRH92YFRE771EvpzfePJ2pro9qGZirP047PjvawbTS3Oo1CHGgXGdhAhJdLC5p/cK1XdxtMpIqBTKqMM5XGinH2XqI2Y4p1xRdccAHt379fiRcWLWwbzZEauRK2bds2dYIRHnjgAXUS+uY3v+lYD/fhuemmm2LdPAAgDnZXN0WdnsOTby/xYDo26Xa3Jm4Td4nM5OdkUHq9KaLIU0RFYy/t1ghRRIFXLx83DgeFTk5wm3IVnYWN3jDUrcGnuZ1IER2OwCihww1Dg2LFhJ/X91ePTvFt/gxEDPVN0YhOPEY5Y8aMUdEeTqWurq5W6dUnnngirV+/ngYNGnTUTXK+qLboV1mPUGXaYarN6U8vt89m94yA8cXql6kyL3SKfunFFRQqzwncqK6r9zQj2bw9ZILx8upVVJZDdPhQwEjjYAwmJl1NqhjIpMo4U2msGGfvI1qjnLjMCBYvXqz+ucFGAzpffvllPJsAAHQhh+oDk/do0CM6flbGXhERwS3iIWlxfQqyadeRkG2ym9Cp0oWOy7ZyMiKnidkRHTeho/XIcRMWuUEhJREdjppIPUx2RoZ7RMdIXYuUJsTCZNO+uoDQ8YjohKWuaZ8J9wnS94Prq0B0cLq1nnLNImfcuHH00EMPqVTro22Ss275AzQl421qowzKXfR7mt9/Mt3+6StUc6SJZsw8kUb2KyR6K2D8sXDBfDvC+KM1L6i/GVk5tHDhHNd1b1n9BT2/Y5O6fdq8udSvKIf+vO89+qz6IPWvrKSFC6dQd5IqBjKpMs5UGivG2XuJ1iinW13XAAA9w+jKQvpsb11g8hQBbjoZzUQ9Uj2ImxD42YIxNHNEOX1lbD/asLvW8ZypRRw1Olnx1eiMriyiNzYfpFGVRWHPcVTJV+gERUssNTrmPun9TNyoKAq8hyp1LRgt8oowyXugCx3uEyTpdOZzqURnjHIEPrlPmTKFNm0KCISjbZLTZ9cr6u/TJRfTt4YcH9hG8DPuoHRKSw8dn3k52ZRpfLZ8LHptN1v7vuRkB/ZPXp/pYtrRXaSKgUyqjDOVxopx9j6i3c/UPCsCkGI8+C/T6F9mDqHffdfdalenvCD045HlU2MSqR7ETeiM7FdE3zt5hIp8ZEQwI9CFVDRCx21ff3HmsfTODfNo6pCysOe80u4k+mVGdFSNTlDo8LbcIzqRxZeOnmrGBehRpa5pE16+LfU5qUy8Rjk6nPr28ccfU//+Ibv0o8lzY26jH7YspjcqF9mPyWfL4lX/XN2Oo2YPYayWT3MxIzD+AgBAKoCIDgApwIi+hXTbOROiWlaP6PhFJCJFdLxSsQQz+GDqFIcZQXb4fvCEjSdxsh23CRzXFHntp5l6xz1Kapva7AiKaUZg1uhEI3Qi1ugUhd5rMWfQx8QcaQyaEQT3Vxd4HMFx249UJFajnFtuuYVmzpxJI0eOpCNHjqj+O1u3bqXvfe973bK/hxva6W8dJ9KlBblhx08glTEkqt3q6vzspfXvAuylAQCpDIQOAMBBuUPodCJ1zcVe2s88wExd61OYQw8smqomeWbti6BSyGyBEFuA2ozo9C3KUUInVKMTTF0LKjAWH5ImxhPScf2LVVqcjqQehcYY2YxAaGhps7db1xy4zYiQybdT10LrdKs9SlViNco5fPiwsqPmZcvKylRE6I033lDW1N2BCFjdzl0+z2bNnMI8rv/11BH00Mtf0H+cOc5z3bp1u0R35FCE0AEApBIQOgAAB/rEy6wL0OkbKXUtQkqVuWq3OfuCCf5pRDwxlEhIrBO4fMOMgNPIvthfHxbRkYkmTzybgullLLz+7bTRKr2tvCCHbn1uQ/DxyJbXOqV5WUq4cJqSjIPXWdfssr9BYabX4XCq08RBJbR2RzUN6xO781eyEYtRzm9+8xv1r6dYPGcE9W/aSmdNCtUQiaDXzSnMY+hnZ4ylRTOG0uByZcvmiv5dMFPWzP5VAACQzEDoAAAclGk1Om4WynoEpHOpa6EJe0EO1+yEohjRoguLaJtz6tt0MwYQZzWp0QmZEXRQfXO7XS/DEaHr5o+l97Yedt2faPaJ++AE6mzaqaHZPzIlqXamvfR/L5pKj7y6hb47e3jUYwc9z4DSPDqmmGhwWUigymcbsBvvcD2GOMI5JIKodRM6ksKWon4VAIAUBT95AADPlC5O5TL51rRBKnpw7tTwXiNmzYsf+oXqktz4XF44mmKvL0ahwwYH+sVtsweNWaPDUZf6YHqZLpJ0c4Bwe2n/n1hu3iqT24ZgtMgr5c8WOrrrWkY6DSrLp5u+Pj7i5Bf0fuSzbW5rt80I/KKqUQkdqc2xa3Rw2gcApA6I6AAAHOiFzwNLw9Nj7vrWJLIsy7Px6G8umES/X7OVfrZgbNSTMY5sxAMbFnyyuyauCSHvf0F2pqqH4avmeqNUh710UJHxcqJBdDHIFs9eTUyjiugEhU5jUER5mQtIqp0jdQ01OkmFHD/NuhlBHDU1Imr4TyiSg4gOACD1gNABAITxt8Un0dZD9XTcwBLX571EDvONKYPUv0joV5ZL8uL7KdJ77cSauiZREhYwhbmZYS5sIXvpwN/qYPE4D123uzZrZnQiRZk4olOcm0V7a5pp26FAl+dWDzctiZBB6CQvbvbS8UR0RNzo3wn5ypq27gAAkMzgLAkACGPCoBL62sQBR3Ub+vyNJ/zx0L84JHTicZOSyAz/NXv1SOqaXFEXoVOQnekQerq4EXEk6BPNZd+ZSreePZ4WjA+4gPFTBdkZNGN4ubrPDV2ZeccGnvcSOqa9NEge9BodiexFMrRwQ447V/c1uK4BAFIInCUBAD2CPgmLW+hoqXVxRXSCtTYsdETYCGbD0FDjTudyWb41OqF9Gl1ZSBfNGkYVQbc6juSwYDp5VIXjNVeeMoJW/NspdOPXnDbHvHxge1qqHCI6SYXTXlpS1+KP6Li6ryGiAwBIIZC6BgDoEfQr1cUcrfA2ePNEbyoaT0RH6l5URCcsdc1Zo1MjER2j/45fXxvdQU2eKwoKluJgut6sYypUdIcv4I/sV0hjq4qUAPp8XyDC4x/RwaQ1mdDtpVt9GuFGImQ8EN44NAPHDAAghcDlQABAwkZ0OlujY6eu5Yanrsmk06zRMRuN6uMI61Gi3Q0JnUxHhIbHPmlwqbp91sQBdlqcGa0RgZTtUxMEEhs3e+l4xKwcFg6hgxodAEAKgogOAKBH0KMdSujUx76OKq1Gp7E19pCQGBD4pa5lutToONahpbKZltp6zY40YhXjBV3cLT1rPD374U767knDPKNDbmYEWUhdSypE3KqITmfMCIJiRhf/crzF63AIAACJCIQOAKBH6AozAj2N7EBdc8yvl+gMi4hwoZPhLnSMiA5Hflb9dI7jNfpzXG+jP/eVMX3puLIOunjWEHu5yYNL1T/ztaF9SbcFji5uENFJ3j46Yi8dT6RS0i31CONls4erXlHROCICAECyAKEDAOgR9EkY16vUdnJ9+2tjFzp6GpmZuibRHpk0HmloUX8LDTMCZnhFgec2RlUWOe5XFObQFWM76Ktj+vrumx7RkbQ19bhPTRBIjj46bC8trmvxOOvJd0tPXePj7tLZw7tsXwEAIBGA0AEA9LgZQUluVtxCp7I4R/WhOclwL4uGb00fTLuONNE3pw1ypAixABpTVeSYLNY0tblGdI4Weo2OnhKnixtEdJK0j44jdS2eGp1woQMAAKkIhA4AoOfNCPKzaEec6/n7NSfTR9uP0Jwx/WJ+7ejKIlq2aKq6vae6yX58/vgqO3VMryVyMyM4WnhFdBw1OhA6SW8vndlFrmsAAJCKQOgAAHqEwPXqUEQnXjglZ+449yabsaCnri2cUGXfNieLYkndnREdZb/tIm6Qupa8Qqehpd3xWCzkBtMuzXRMAABINSB0AAA9Qn1zIBXMza2sJ+B9mDWiD7W2d9Apo0L1M2bqkNkwtHsiOh6paxA6SdtHZ93OanV7ZD9njVc0TBpUSledegydMLy8y/cRAAASiZ6fXQAAUpLaYM1Lb0mx4YaKf7pyZtjjZupQd6WuOV3XMlzrcpC6lrx9dN7bdljdnj60LOb18PfpZwvGdvn+AQBAogGhAwDoEcryE6OfhzQMFXrCjEC/rYsbs6koSGxExO6qbqQjDa3EpTaThzhtxwEAAEQPhA4AoEc47dgq+tdTR9D0ob07vaanIjp65EaP7ujpaojoJBfy2bLIYcZUFinrcwAAAPEBoQMA6BE4veb6BePU7dbWwMSuN2Km1XVXRIdT6dzFDfroJCtmhG7KkNjT1gAAAITAWRIAAHzQhUV3mhF4TYCdNTo9X9sEjp7QGV6R32P7AgAAyQCEDgAAxFCj012pazpeBgSI6CQX5udZmp/dY/sCAADJAM6SAAAQQ41Od6Wu6eRkuYsbXQCBxEevxWLKIXQAAKBToEYHAABiqNHpzojO8IoC2nKgXhk3CPnZGTR+QDG1tVsoVE/yiE5ZAT5fAADoDBA6AAAQZUSHG3fqPW2ONv/40cl0uKGF+pfk2Y+lpaXRXxefRJZlOQwLQOKD1DUAAOhaIHQAAMCHTC09rLI4t1u3zaJKFznOKBNETrJhpiIidQ0AADoHErwBACDKiE6/opwe3ReQ3JguesV5SF0DAIDOAKEDAABR1uhA6ICjCacl+tWHAQAAiA0IHQAAiDKi092pawAAAACIHwgdAADwQb+q3hcRHdBNFGR3f2NaAABINiB0AADAB71BZz9EdEA3kd8D/ZoAACDZgNABAAAfUKMDegJEdAAAoPNA6AAAgA+o0QE9QX42IjoAANBZIHQAAMCH5rYO+zYiOqC7KMhBRAcAADoLhA4AAPhwqL7Fvl2AugnQTSCiAwAAnQdCBwAAfJgxvFz9LctH80Zw9Jk9so/6e+nsYT29KwAAkPDgkhEAAPgwuDyfXv33r1BZQXZP7wpIAR699HjacbiRjulb2NO7AgAACQ+EDgAARCF2AOgOcjIzIHIAAKCLQOoaAAAAAAAAIOmA0AEAAAAAAAAkHRA6AAAAAAAAgKQDQgcAAAAAAACQdEDoAAAAAAAAAJIOCB0AAAAAAABA0gGhAwAAAAAAAEg6IHQAAAAAAAAASUdcQmfZsmU0bNgwys3NpRNOOIHefvttz2XXr19P5513nlo+LS2N7rvvvs7sLwAAAAAAAAB0vdB58skn6dprr6WlS5fS+++/T5MmTaL58+fTvn37XJdvaGigESNG0B133EFVVVWxbg4AAAAAAAAAjr7Quffee+mKK66gyy67jI499lh68MEHKT8/nx599FHX5Y8//ni666676Nvf/jbl5OTEvocAAAAAAAAAECOZsSzc0tJC7733Hl1//fX2Y+np6TRv3jxas2YNdRXNzc3qn1BTU6P+tra2qn+xIq+J57WJBMaZfKTKWFNlnIk41kTZTwAAAKBTQufAgQPU3t5OlZWVjsf5/saNG6mruP322+nmm28Oe/yFF15Q0aN4WbFiBaUCGGfykSpjTZVxJtJYOf0YAAAASHqh011wxIjrgPSIzuDBg+n000+n4uLiuK5I8qTitNNOo6ysLEpWMM7kI1XGmirjTMSxSkQdAAAASGqhU1FRQRkZGbR3717H43y/K40GuJZHr+exLEv9bWxsjGtiwBMLvirJr29ra6NkBeNMPlJlrKkyzkQcK++n/jsMyPF+xCsE5Tjg1yeC4O0MqTLWVBlnKo0V4+y9yG9vpHNTTEInOzubpk2bRitXrqRzzjlHPdbR0aHuL168mI4WtbW16i9HdQAAAHQ//DtcUlLS07vRa8B5CQAAev+5KebUNU4pu+SSS2j69Ok0Y8YM1Renvr5eubAxF198MQ0cOFDV2YiBwYYNG+zbO3fupA8//JAKCwtp5MiRUW1zwIABtH37dioqKlK9eGJFUt94HfGkviUKGGfykSpjTZVxJuJY+WoZn0j4dxiEwHkpelJlrKkyzlQaK8aZ+OemmIXOBRdcQPv376cbb7yR9uzZQ5MnT6bnn3/eNijYtm2bcmITdu3aRVOmTLHv33333erfqaeeSqtXr45qm7y+QYMGUWfhDy9RPsDOgHEmH6ky1lQZZ6KNFZGccHBeip1UGWuqjDOVxopxJu65KS4zAk5T80pVM8XLsGHDkNsNAAAAAAAA6N0NQwEAAAAAAACgt5MSQocd3JYuXepwcktGMM7kI1XGmirjTLWxAm9S6ThIlbGmyjhTaawYZ+KTZiGvDAAAAAAAAJBkpEREBwAAAAAAAJBaQOgAAAAAAAAAkg4IHQAAAAAAAEDSAaEDAAAAAAAASDqSXugsW7ZM9fLJzc2lE044gd5++21KJG666SbVdVv/N3bsWPv5pqYmuvrqq6lPnz5UWFhI5513Hu3du9exDm7ieuaZZ1J+fj7169ePrrvuOmpra6Oe5JVXXqGzzjpLdbTlMT3zzDOO59kjg5vS9u/fn/Ly8mjevHn0+eefO5Y5dOgQLVq0SDW3Ki0tpcsvv5zq6uocy6xdu5ZOPvlk9flz198777yTettYL7300rDP+Iwzzki4sd5+++10/PHHq07xfJydc8459OmnnzqW6arjlft1TZ06VTnEjBw5kh577DHqTeOcM2dO2Gd61VVXOZbp7eMERxecm3Buwrnp6JMq5yUG5yYPrCTmiSeesLKzs61HH33UWr9+vXXFFVdYpaWl1t69e61EYenSpdb48eOt3bt32//2799vP3/VVVdZgwcPtlauXGm9++671syZM60TTzzRfr6trc067rjjrHnz5lkffPCBtXz5cquiosK6/vrrrZ6E9+OGG26wnnrqKXb9s55++mnH83fccYdVUlJiPfPMM9ZHH31kff3rX7eGDx9uNTY22succcYZ1qRJk6w333zTevXVV62RI0daF154of18dXW1VVlZaS1atMhat26d9ac//cnKy8uzHnrooV411ksuuUSNRf+MDx065FgmEcY6f/5867e//a3a/ocffmgtXLjQGjJkiFVXV9elx+sXX3xh5efnW9dee621YcMG6/7777cyMjKs559/vteM89RTT1W/N/pnyp9RIo0THD1wbsK5qad/r1Pl3JQq56Vox3pqCp6bklrozJgxw7r66qvt++3t7daAAQOs22+/3Uqkkwn/iLhx5MgRKysry/q///s/+7FPPvlE/WCtWbNG3eeDND093dqzZ4+9zAMPPGAVFxdbzc3NVm/A/IHt6OiwqqqqrLvuussx1pycHPUjyfCXi1/3zjvv2Mv84x//sNLS0qydO3eq+//93/9tlZWVOca5ZMkSa8yYMVZP4XUyOfvssz1fk6hj3bdvn9rvl19+uUuP13//939XEyydCy64QP3I94ZxysnkRz/6kedrEnGcoOvAuQnnpt72e50q56ZUOS8xODcFSNrUtZaWFnrvvfdUWFlIT09X99esWUOJBIfFObQ8YsQIFSLmsCLD42ttbXWMkVMHhgwZYo+R/06YMIEqKyvtZebPn081NTW0fv166o1s2bKF9uzZ4xhXSUmJSu/Qx8Vh8unTp9vL8PL8Gb/11lv2MqeccgplZ2c7xs6h3MOHD1NvgsPAHCIeM2YMff/736eDBw/azyXqWKurq9Xf8vLyLj1eeRl9HbJMT32vzXEKjz/+OFVUVNBxxx1H119/PTU0NNjPJeI4QdeAcxPOTb3x9zpVzk2pcl5icG4KkElJyoEDB6i9vd3xYTF8f+PGjZQo8A8o5z7yj8zu3bvp5ptvVrmu69atUz+4/OPBPzTmGPk5hv+6vQfyXG9E9sttv/Vx8Y+vTmZmpvpC68sMHz48bB3yXFlZGfUGOOf53HPPVfu6efNm+vnPf04LFixQPxoZGRkJOdaOjg768Y9/TLNnz1Y/prIfXXG8ei3DP8SNjY0qb74nx8l85zvfoaFDh6pJIOenL1myRJ3Yn3rqKd8xyHO9bZyg68C5Ceem3vZ7nSrnplQ5LzE4N6WA0EkW+EdFmDhxojq58EH65z//udcdTCA+vv3tb9u3+UoKf87HHHOMupI2d+5cSkS4sJMnPK+99holM17jvPLKKx2fKRcu82fJkwX+bAFIdHBuSn6S7dyUKuclBuemEEmbusZhOb7iYDpn8P2qqipKVPiqw+jRo2nTpk1qHJwGceTIEc8x8l+390Ce643Ifvl9dvx33759jufZFYQdYBJ57AyngfDxy59xIo518eLF9Nxzz9GqVato0KBB9uNddbx6LcOuP905wfIapxs8CWT0zzRRxgm6Fpybet9vVrTg3JS456ZUOS8xODeliNDhUOS0adNo5cqVjlAe3581axYlKmzbyMqbVTiPLysryzFGDkFynrSMkf9+/PHHjh+jFStWqAPy2GOPpd4Ih7n5i6SPi0OinPOrj4t/mDi/VnjppZfUZyxfXF6G7TM5/1YfO6da9JbUADd27Nih8qD5M06ksXI9K//APv3002r/zHSFrjpeeRl9HbJMd32vI43TjQ8//FD91T/T3j5OcHTAuQnnpt7we50q56ZUOS8xODd5YCW5hSe7oTz22GPKHeTKK69UFp66m0Rv5yc/+Ym1evVqa8uWLdbrr7+uLP/Y6o/dNMQWke0DX3rpJWWLOGvWLPXPtAo8/fTTld0g2//17du3xy08a2trlXUh/+PD8N5771W3t27dalt48mf17LPPWmvXrlXOL24WnlOmTLHeeust67XXXrNGjRrlsLVkNxW2tbzooouU3SIfD2yJ2N0Wnn5j5ed++tOfKncX/oxffPFFa+rUqWosTU1NCTXW73//+8p2lY9X3bqyoaHBXqYrjlextrzuuuuUO86yZcu61doy0jg3bdpk3XLLLWp8/JnyMTxixAjrlFNOSahxgqMHzk04N/X073WqnJtS5bwUzVg3pei5KamFDsP+3nwAc88CtvRkr/dEgi37+vfvr/Z/4MCB6j4frAL/uP7gBz9Q9o184H3jG99QB7bOl19+aS1YsEB51/OJiE9Qra2tVk+yatUq9cNq/mM7S7Hx/MUvfqF+IHlCMHfuXOvTTz91rOPgwYPqB7WwsFBZH1522WXqx1mH+xycdNJJah38/vFJqjeNlX+A+AeFf0jY4nLo0KHK496c8CTCWN3GyP/Y17+rj1d+TydPnqy+F/xDrW+jp8e5bds2deIoLy9XnwX3leATgt6rIBHGCY4uODfh3IRz09EnVc5LDM5N7qTxf17RHgAAAAAAAABIRJK2RgcAAAAAAACQukDoAAAAAAAAAJIOCB0AAAAAAABA0gGhAwAAAAAAAEg6IHQAAAAAAAAASQeEDgAAAAAAACDpgNABAAAAAAAAJB0QOgAAAAAAAICkA0IHgC7i0ksvpXPOOaendwMAAABQ4LwEUh0IHQAAAAAAAEDSAaEDQIz85S9/oQkTJlBeXh716dOH5s2bR9dddx397ne/o2effZbS0tLUv9WrV6vlt2/fTueffz6VlpZSeXk5nX322fTll1+GXXG7+eabqW/fvlRcXExXXXUVtbS09OAoAQAAJAo4LwHgTqbH4wAAF3bv3k0XXngh3XnnnfSNb3yDamtr6dVXX6WLL76Ytm3bRjU1NfTb3/5WLcsnj9bWVpo/fz7NmjVLLZeZmUm33XYbnXHGGbR27VrKzs5Wy65cuZJyc3PVSYhPNpdddpk6Wf3yl7/s4REDAADozeC8BIA3EDoAxHhCaWtro3PPPZeGDh2qHuOraAxfSWtubqaqqip7+T/84Q/U0dFBjzzyiLqaxvAJh6+i8cnj9NNPV4/xieXRRx+l/Px8Gj9+PN1yyy3qatytt95K6ekIvAIAAHAH5yUAvMGRCkAMTJo0iebOnatOIt/61rfo4YcfpsOHD3su/9FHH9GmTZuoqKiICgsL1T++otbU1ESbN292rJdPJgJfaaurq1PpBQAAAIAXOC8B4A0iOgDEQEZGBq1YsYLeeOMNeuGFF+j++++nG264gd566y3X5fmkMG3aNHr88cfDnuO8ZwAAAKAz4LwEgDcQOgDECIf6Z8+erf7deOONKlXg6aefVmH+9vZ2x7JTp06lJ598kvr166eKOf2usDU2Nqo0A+bNN99UV9kGDx581McDAAAgscF5CQB3kLoGQAzwFbJf/epX9O6776oiz6eeeor2799P48aNo2HDhqlCzk8//ZQOHDigCj4XLVpEFRUVytGGiz63bNmicqCvueYa2rFjh71edrK5/PLLacOGDbR8+XJaunQpLV68GHnQAAAAfMF5CQBvENEBIAb46tcrr7xC9913n3Ky4atm99xzDy1YsICmT5+uThb8l1MDVq1aRXPmzFHLL1myRBWKshvOwIEDVT61fiWN748aNYpOOeUUVTjKDjo33XRTj44VAABA7wfnJQC8SbMsy/J5HgBwlOF+BUeOHKFnnnmmp3cFAAAAwHkJJA2IP0kuAaEAAACFSURBVAIAAAAAAACSDggdAAAAAAAAQNKB1DUAAAAAAABA0oGIDgAAAAAAACDpgNABAAAAAAAAJB0QOgAAAAAAAICkA0IHAAAAAAAAkHRA6AAAAAAAAACSDggdAAAAAAAAQNIBoQMAAAAAAABIOiB0AAAAAAAAAEkHhA4AAAAAAACAko3/DwasVf2JZVQgAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 60
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-23T13:15:40.025475Z",
     "start_time": "2025-01-23T13:15:36.257159Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/imdb-adding/best.ckpt\", weights_only=True,map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, test_dl, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3170\n",
      "accuracy: 0.8754\n"
     ]
    }
   ],
   "execution_count": 61
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
